zoukankan      html  css  js  c++  java
  • 设计模式(一)—— 简单工厂

    模式简介


    简单工厂模式属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

    结构分析


    UML类图

    角色说明

    • AbstractProduct

    抽象产品。简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

    • ConcreteProduct

    具体产品。简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体实例。

    • Factory

    工厂。简单工厂模式的核心,负责实现创建所有实例的内部逻辑,工厂类的创建产品类可以被外界直接调用,创建所需的产品对象。

    示例分析


    假设我们要开发一款支持多种图表的工具包,能够从中获取折线图(Line Chart)、柱状图(Bar Chart)、饼状图(Pie Chart)等,下面我们使用简单工厂模式来实现该功能。

    创建图表抽象类Chart,包含抽象方法Draw

     public abstract class Chart
     {
        public abstract void Draw();
     }
    

    创建具体图表类LineChart、BarChart、PieChart

    public class LineChart : Chart
    {
        public override void Draw()
        {
            string lineChart = "|                        
    ";
            lineChart += "|                       -     
    ";
            lineChart += "|                       -     
    ";
            lineChart += "|                    --       
    ";
            lineChart += "|                --           
    ";
            lineChart += "|            ---              
    ";
            lineChart += "|      ---                    
    ";
            lineChart += "|   -                         
    ";
            lineChart += "|______________________________";
            Console.WriteLine(lineChart);
        }
    }
    
    public class BarChart : Chart
    {
        public override void Draw()
        {
            string barChart = "|                             
    ";
            barChart += "|             __                    
    ";
            barChart += "|            |  |             __    
    ";
            barChart += "|     __     |  |            |  |   
    ";
            barChart += "|    |  |    |  |     __     |  |   
    ";
            barChart += "|    |  |    |  |    |  |    |  |   
    ";
            barChart += "|    |  |    |  |    |  |    |  |   
    ";
            barChart += "|____|__|____|__|____|__|____|__|_____";
            Console.WriteLine(barChart);
        }
    }
    
    public class PieChart : Chart
    {
        public override void Draw()
        {
            string lineChart = "|                         
    ";
            lineChart += "|          ------------         
    ";
            lineChart += "|         |***@@@@@@@@@|        
    ";
            lineChart += "|        |*****@@@@@@@@@|       
    ";
            lineChart += "|       |*******@@@@@@@@@|      
    ";
            lineChart += "|      |*********@@@@@@@@@|     
    ";
            lineChart += "|       |********$$$$$$$$|      
    ";
            lineChart += "|        |******$$$$$$$$|       
    ";
            lineChart += "|         |****$$$$$$$$|        
    ";
            lineChart += "|          ------------         
    ";
            lineChart += "|______________________________";
            Console.WriteLine(lineChart);
        }
    }
    

    最后创建Chart工厂类

    public class ChartFactory
    {
        public Chart CreateChart(string type)
        {
            Chart chart;
    
            switch (type)
            {
                case "L":
                    chart = new LineChart();
                    break;
                case "B":
                    chart = new BarChart();
                    break;
                case "P":
                    chart = new PieChart();
                    break;
                default:
                    throw new KeyNotFoundException();
            }
    
            return chart;
    
        }
    }
    

    当然,这里也可以利用静态方法创建一个工厂,因为在使用时我们不必再创建工厂对象,直接调用静态方法来实例化对象。但这也有缺点,即不能通过继承来改变创建方法的行为

    客户端调用

    static void Main(string[] args)
    {
        ChartFactory factory = new ChartFactory();
        var chart = factory.CreateChart("B");
        chart.Draw();
        Console.ReadLine();
    }
    

    运行结果:

    优缺点


    优点:

    • 客户端不必关心对象如何创建以及如何组织,由工厂类决定应该创建哪个具体类的对象。
    • 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

    缺点:

    • 工厂类集中了所有实例的创建逻辑,当产品不断增加,工厂类根据不同条件创建不同实例时,容易出现混乱,不利于系统的维护和扩展。
    • 如果增加新的产品,工厂类也需要做出相应的修改,违反了开放封闭原则

    适用场景


    • 工厂类负责创建的对象较少

    • 客户端只知道传入工厂的参数,对于如何创建对象(逻辑)不关心

  • 相关阅读:
    学习嵌入式规划
    函数指针与指针函数
    css3
    css
    file upload使用iframe
    上传图片,文件
    table td里面的内容多的话出...
    html5 新标签
    html element
    css/html规范
  • 原文地址:https://www.cnblogs.com/Answer-Geng/p/8869563.html
Copyright © 2011-2022 走看看