• 设计模式(02):创建型模式(过渡模式) 简单工厂模式(Simple Factory)


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

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

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

    一、UML图

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

    简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。

    二、简单工厂模式的代码实现

    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图为:

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

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

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

  • 相关阅读:
    怎么在sublime里面显示编码格式
    鸟哥的Linux私房菜——第十七章:Linux 账号与身份管理
    反复
    鸟哥的Linux私房菜——第十六章:学习Shell Scripts
    鸟哥的Linux私房菜——第十五章:正规表示法
    鸟哥的Linux私房菜——第十四章:Bash Shell
    鸟哥的Linux私房菜——第十三章:Vim编译器
    Expression Blend实例中文教程(10)
    Expression Blend实例中文教程(9)
    Expression Blend实例中文教程(8)
  • 原文地址:https://www.cnblogs.com/springsnow/p/11306792.html
Copyright © 2020-2023  润新知