设计模式—— 简单工厂

Posted answer-geng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式—— 简单工厂相关的知识,希望对你有一定的参考价值。

简单工厂

简介

简单工厂模式属于创建型模式,又叫做静态工厂方法(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 = "|                        \\n";
        lineChart += "|                       -     \\n";
        lineChart += "|                       -     \\n";
        lineChart += "|                    --       \\n";
        lineChart += "|                --           \\n";
        lineChart += "|            ---              \\n";
        lineChart += "|      ---                    \\n";
        lineChart += "|   -                         \\n";
        lineChart += "|______________________________";
        Console.WriteLine(lineChart);
    }
}

public class BarChart : Chart
{
    public override void Draw()
    {
        string barChart = "|                             \\n";
        barChart += "|             __                    \\n";
        barChart += "|            |  |             __    \\n";
        barChart += "|     __     |  |            |  |   \\n";
        barChart += "|    |  |    |  |     __     |  |   \\n";
        barChart += "|    |  |    |  |    |  |    |  |   \\n";
        barChart += "|    |  |    |  |    |  |    |  |   \\n";
        barChart += "|____|__|____|__|____|__|____|__|_____";
        Console.WriteLine(barChart);
    }
}

public class PieChart : Chart
{
    public override void Draw()
    {
        string lineChart = "|                         \\n";
        lineChart += "|          ------------         \\n";
        lineChart += "|         |***@@@@@@@@@|        \\n";
        lineChart += "|        |*****@@@@@@@@@|       \\n";
        lineChart += "|       |*******@@@@@@@@@|      \\n";
        lineChart += "|      |*********@@@@@@@@@|     \\n";
        lineChart += "|       |********$$$$$$$$|      \\n";
        lineChart += "|        |******$$$$$$$$|       \\n";
        lineChart += "|         |****$$$$$$$$|        \\n";
        lineChart += "|          ------------         \\n";
        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();
}

运行结果:

技术分享图片

优缺点

  • 优点:
  1. 客户端不必关心对象如何创建以及如何组织,由工厂类决定应该创建哪个具体类的对象。
  2. 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
  • 缺点:
  1. 工厂类集中了所有实例的创建逻辑,当产品不断增加,工厂类根据不同条件创建不同实例时,容易出现混乱,不利于系统的维护和扩展。
  2. 如果增加新的产品,工厂类也需要做出相应的修改,违反了开放封闭原则

适用场景

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

示例代码下载

dotnet-design-pattern_simplefactory

以上是关于设计模式—— 简单工厂的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式-简单工厂工厂方法模式抽象工厂模式详解

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

设计模式之简单工厂模式

C#之三十八 简单工厂设计模式