设计模式 -- 简单工厂模式

Posted on 2013-07-25 18:00  冰天雪域  阅读(271)  评论(0编辑  收藏  举报

设计模式之简单工厂模式

转载请注明出处,谢谢

参考资料: 

做一只靠得住的猪 

左潇龙  

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



 

Copyright © 2024 冰天雪域
Powered by .NET 9.0 on Kubernetes