设计模式之简单工厂模式
转载请注明出处,谢谢
参考资料:
1 做一只靠得住的猪
2 左潇龙
3 大话设计模式
概念
简单工厂(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 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。