zoukankan      html  css  js  c++  java
  • 设计模式 -- 简单工厂模式

    设计模式之简单工厂模式

    转载请注明出处,谢谢

    参考资料: 

    做一只靠得住的猪 

    左潇龙  

    3 大话设计模式

    51CTO--思考简单工厂

    概念

    简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,但其不属于23种GOF设计模式之一,通常它根据自变量的不同返回不同的类的实例。


    特点

    简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建出哪一个产品类的实例。由上图可以看出,简单工厂模式有工厂、抽象产品、具体产品三个角色。

      工厂角色(Factory)  是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。可被外界直接调用来创建产品对象

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

      具体产品角色(ProductA、ProductB....)  是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例


    具体实例

    该实例出自大话设计模式,说的是要设计一个计算器,其中该计算器包括了+、 - 、 * 、 / 等运算,该计算器采用简单工厂设计模式来进行设计编码。于是根据以上的介绍,简单工厂设计模式需要有一个工厂角色、抽象产品角色、具体产品角色这三大角色。我们可假设运算定位为抽象产品角色或者父类,具体的运算如+ 、- 、* 、 / 等作为具体产品角色,工厂角色根据具体的运算符类别产生相应的运算实例。
    class Operation         //抽象产品角色
    {
          public:
          Operation(double,double);
          double getNumberA(){ return a; }
          double getNumberB(){ return b; }
        private:
           double a,b;
    };
    

    class OperationAdd:public Operation    //具体角色产品 +运算
    {  .........
         public:
         double Add(double,double);
          ........
    };
    class OperationMinus:public Operation   //具体角色产品  -运算
    {      .........
             public:
             double Minus(double,double);
             ........
    };
    class OperationMultiply:public Operation    //具体角色产品  *运算
    {     .......
           public:
           double Multiply(double,double);
           .......
    };
    class Factory   //工厂角色
    {
          ..........
          Operation CreateFactory(char type)
         {
             switch(type)             //通过条件判断产生什么类型的具体角色产品
             {
                    case '+': return OperationAdd();
                     case '-':return OperationMinus();
                      ...........
              }
         }
          ..........
    };

    缺点

     
    1 在工厂角色中,将多个逻辑集中放在一个类里面有其自身的缺点。当产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难。
    2 私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。不过,通常情况下是不需要为简单工厂创建子类的。

    何时使用简单工厂模式

    1 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现。

    2 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。



  • 相关阅读:
    性能测试的感悟
    Web性能测试问题,mysql分析之一
    LoadRunner使用代理远程执行提示找不到“pre_cci.c”文件
    yii widget验证码不实用form验证的方法
    mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
    (亲测)nginx解决thinkphp中pathinfo的问题
    一个超好用的php header下载函数
    编程中的一些概念,KISS、DRY、MVC、OOP、REST
    8个开发必备的PHP功能(转)
    关于按钮在短时间内多次点击的问题.
  • 原文地址:https://www.cnblogs.com/aukle/p/3214892.html
Copyright © 2011-2022 走看看