时间:2014.02.19
地点:基地
--------------------------------------------------------------------------------
简单工厂模式属于属于创建型模式,简单实用,它是由一个工厂对象决定创建哪一种产品类的实例。例如我们定义一类产品,这类产品具体是IPhone和IPad,当客户需要IPhone时告诉工厂,工厂就生产返回一个IPhone给客户,当客户需要IPad时也告诉工厂,工厂就生产返回一个IPad给客户。
--------------------------------------------------------------------------------
1.工厂角色
模式的核心,负责生产实例,工厂类可被客户端调用,客户需要什么告诉工厂即可,而无需关注产品细节。
2.抽象产品角色
简单工厂模式所创建的所有产品的父类,负责描述所有实例所共有的公共接口。
3.具体产品角色
创建目标,即具体产品类的实例。
--------------------------------------------------------------------------------
1.工厂负责创建的对象较少
2.客户只知道传入工厂的参数,而并不关心如何创建
3.由于违反高内聚责任分配原则,故一般只用于简单场景
--------------------------------------------------------------------------------
优点:客户端只传入类或识别符即可,无须关心具体创建过程,只顾消费就可,即各角色分工明确,这样有利于软件架构。
缺点:违反高内聚责任分配原则,它将全部逻辑放到一个工厂类中,但若需要添加新类,则须对工厂类逻辑进行修改,并且,该简单工厂只提供一个系列的产品,若是其他系列产品,他们没有共同的父类或接口,那么则该换用其他模式。
--------------------------------------------------------------------------------
假设客户端需要对两个数进行算数操作,有时需要加法,有时需要减法,或者乘法,除法均有可能。更需要而定,啊,我们其他需要加法时告诉工厂我们需要一个加法器,需要乘法时告诉工厂需要乘法器,工厂就会给我们生产。
简单的实例代码如下:
#include<string> #include<iostream> using namespace std; //抽象产品角色 class COperation{ public: int m_nFirst; int m_nSecond; virtual double GetResult(){ double dResult = 0; return dResult; } }; //具体产品角色 class AddOperation :public COperation{ public: virtual double GetResult(){ return m_nFirst + m_nSecond; } }; class SubOperation :public COperation{ public: virtual double GetResult(){ return m_nFirst - m_nSecond; } }; class MultiOperation :public COperation{ public: virtual double GetResult(){ return m_nFirst*m_nSecond; } }; class DiviOperation :public COperation{ public: virtual double GetResult(){ return m_nFirst / m_nSecond; } }; //工厂角色 class CalculatorFactory{ public: static COperation* Create(char COperator); }; COperation* CalculatorFactory::Create(char Coperator){ COperation *oper; switch (Coperator){ case ‘+‘: oper = new AddOperation(); break; case ‘-‘: oper = new SubOperation(); break; case ‘*‘: oper = new MultiOperation(); break; case ‘/‘: oper = new DiviOperation(); break; default: oper = new AddOperation(); } return oper; } //客户 int main(){ int a, b; cin >> a >> b; COperation *op = CalculatorFactory::Create(‘-‘); op->m_nFirst = a; op->m_nSecond = b; cout << op->GetResult() << endl; return 0; }
原文:http://blog.csdn.net/u012333003/article/details/19504785