一、意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory使一个类的实例化延迟到其子类。(四人团)
实际上: 工厂模式主要就是用于创建对象。新添加类时,不会影响以前的系统代码。
二、基本思想
核心思想:是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。
客户类和工厂类分开,消费者任何时候需要某种产品类对象,只需要向工厂类(有静态成员函数接收)提交参数和请求即可。消费者无需修改(直接用所有产品共同的父类指针指向)就可以接纳和使用新产品类的对象。
三、优缺点分析
GOOD: 适用于不同情况创建不同的类时
BAD: 客户端必须要知道基类和工厂类,耦合性差,而且当产品修改时,工厂类也要做相应修改(如:如何创建及如何向客户端提供)
四、UML实例图
注意点:(工厂类与基类为关联关系)
五、示例源码
1: (工厂类与基类为关联关系)
2: 例:
3: //基类
4: class COperation
5: {
6: public:
7: int m_nFirst;
8: int m_nSecond;
9: virtual double GetResult()
10: {
11: double dResult=0;
12: return dResult;
13: }
14: };
15: //加法
16: class AddOperation : public COperation
17: {
18: public:
19: virtual double GetResult()
20: {
21: return m_nFirst+m_nSecond;
22: }
23: };
24: //减法
25: class SubOperation : public COperation
26: {
27: public:
28: virtual double GetResult()
29: {
30: return m_nFirst-m_nSecond;
31: }
32: };
33:
34: //工厂类
35: class CCalculatorFactory
36: {
37: public:
38: static COperation* Create(char cOperator);
39: };
40:
41: COperation* CCalculatorFactory::Create(char cOperator)
42: {
43: COperation *oper;
44: //在C#中可以用反射来取消判断时用的switch,在C++中用什么呢?RTTI??
45: switch (cOperator)
46: {
47: case '+':
48: oper=new AddOperation();
49: break;
50: case '-':
51: oper=new SubOperation();
52: break;
53: default:
54: oper=new AddOperation();
55: break;
56: }
57: return oper;
58: }
59:
60: 客户端
61: int main()
62: {
63: int a,b;
64: cin>>a>>b;
65: COperation * op=CCalculatorFactory::Create('-');
66: op->m_nFirst=a;
67: op->m_nSecond=b;
68: cout<<op->GetResult()<<endl;
69: return 0;
70: }