创建型模式(过渡模式) 简单工厂模式(Simple Factory Pattern)

简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern)

是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

这个模式并不属于GoF23里面的设计模式,其实他属于一个过渡的模式,这个模式是为了引出下一篇要将的模式:工厂模式。

UML图

创建型模式(过渡模式) 简单工厂模式(Simple Factory Pattern)

简单工厂模式解决的问题是如何去实例化一个合适的对象。

简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。

具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。

实例:

public static Operation createOperate(string operate)
{
    Operation oper = null;
    switch (operate)
    {
        case "+":
            {
                oper = new OperationAdd();
                break;
            }
        case "-":
            {
                oper = new OperationSub();
                break;
            }
        case "*":
            {
                oper = new OperationMul();
                break;
            }
        case "/":
            {
                oper = new OperationDiv();
                break;
            }
    }
    return oper;
}

.NET中简单工厂模式的实现

介绍完了简单工厂模式之后,.NET类库中也有类似的实现,NET中System.Text.Encoding类就实现了简单工厂模式,该类中的GetEncoding(int codepage)就是工厂方法具体的代码可以通过Reflector反编译工具进行查看

.NET 中Encoding的UML图为:
创建型模式(过渡模式) 简单工厂模式(Simple Factory Pattern)
Encoding类中实现的简单工厂模式是简单工厂模式的一种演变,此时简单工厂类由抽象产品角色扮演,然而.NET中Encoding类是如何解决简单工厂模式中存在的问题的呢(即如果新添加一种编码怎么办)?在GetEncoding方法里的switch函数有如下代码:

switch (codepage)
     {
          .......
   default:
                    unicode = GetEncodingCodePage(codepage);
                    if (unicode == null)
                    {
                        unicode = GetEncodingRare(codepage); //当编码很少见时
                    }
                    break;
           ......
      }

在GetEncodingRare方法里有一些不常用编码的实例化代码,微软正式通过这个方法来解决新增加一种编码的问题。(其实也就是列出所有可能的编码情况),微软之所以以这样的方式来解决这个问题,可能是由于现在编码已经稳定了,添加新编码的可能性比较低,所以在.NET 4.5仍然未改动这部分代码。

优缺点分析:

优点:客户端不需要修改代码。
缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

上一篇:luogu_P4092 [HEOI2016/TJOI2016]树


下一篇:设计模式之(简单工厂)(C#实现)(程杰)