工厂方法模式

【1】什么是工厂方法模式?

定义一个创建产品对象的工厂接口(IFactory),将实际创建工作推迟到子类(addFactory、subFactory、mulFactory、divFactory)当中。

核心工厂类(IFactory)不再负责产品的创建,仅作为一个抽象(有纯虚方法)工厂角色,只负责声明具体工厂子类必须实现的接口(即纯虚方法)。

这样进一步抽象化的好处:系统在不需要修改具体工厂角色的情况下引进新的产品(与简单工厂模式相比)。

【2】工厂方法模式代码示例

示例代码如下:

  1 #include <string>
  2 #include <iostream>
  3 using namespace std;
  4 
  5 class Operation
  6 {
  7 protected:
  8     double m_numberA;
  9     double m_numberB;
 10 
 11 public:
 12     double getNumberA()
 13     {
 14         return m_numberA;
 15     }
 16 
 17     void setNumberA(double dValue)
 18     {
 19         m_numberA = dValue;
 20     }
 21 
 22     double getNumberB()
 23     {
 24         return m_numberB;
 25     }
 26 
 27     void setNumberB(double dValue)
 28     {
 29         m_numberB = dValue;
 30     }
 31 
 32     virtual double getResult()
 33     {
 34         return 0;
 35     }
 36 };
 37 
 38 class addOperation : public Operation
 39 {
 40 public:
 41     double getResult()
 42     {
 43         return m_numberA + m_numberB;
 44     }
 45 };
 46 
 47 class subOperation : public Operation
 48 {
 49 public:
 50     double getResult()
 51     {
 52         return m_numberA - m_numberB;
 53     }
 54 };
 55 
 56 class mulOperation : public Operation
 57 {
 58 public:
 59     double getResult()
 60     {
 61         return m_numberA * m_numberB;
 62     }
 63 };
 64 
 65 class divOperation : public Operation
 66 {
 67 public:
 68     double getResult()
 69     {
 70         return m_numberA / m_numberB;
 71     }
 72 };
 73 
 74 class IFactory
 75 {
 76 public:
 77     virtual Operation *createOperation() = 0;
 78 };
 79 
 80 class AddFactory : public IFactory
 81 {
 82 public:
 83     static Operation *createOperation()
 84     {
 85         return new addOperation();
 86     }
 87 };
 88 
 89 class SubFactory : public IFactory
 90 {
 91 public:
 92     static Operation *createOperation()
 93     {
 94         return new subOperation();
 95     }
 96 };
 97 
 98 class MulFactory : public IFactory
 99 {
100 public:
101     static Operation *createOperation()
102     {
103         return new mulOperation();
104     }
105 };
106 
107 class DivFactory : public IFactory
108 {
109 public:
110     static Operation *createOperation()
111     {
112         return new divOperation();
113     }
114 };
115 
116 void main()
117 {
118     Operation *pOper = MulFactory::createOperation();
119     pOper->setNumberA(9);
120     pOper->setNumberB(99);
121     cout << pOper->getResult() << endl;
122     
123     delete pOper;
124     pOper = NULL;
125 
126     system("pause");
127 }
128 
129 // run out:
130 /*
131 891
132 请按任意键继续. . .
133 */

【3】工厂方法模式示例代码

代码如下:

 1 #include <string>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 // 抽象产品类1
 6 class IUser
 7 {
 8 public:
 9     virtual void getUser() = 0;
10     virtual void setUser() = 0;
11 };
12 
13 // 具体产品类1(SqlUser)
14 class SqlUser : public IUser
15 {
16 public:
17     void getUser()
18     {
19         cout << "在sql中返回user" << endl;
20     }
21     void setUser()
22     {
23         cout << "在sql中设置user" << endl;
24     }
25 };
26 
27 // 具体产品类1(AccessUser)
28 class AccessUser : public IUser
29 {
30 public:
31     void getUser()
32     {
33         cout << "在Access中返回user" << endl;
34     }
35     void setUser()
36     {
37         cout << "在Access中设置user" << endl;
38     }
39 };
40 
41 // 抽象工厂类
42 class IFactory
43 {
44 public:
45     virtual IUser *createUser() = 0;
46 };
47 
48 // 具体工厂类(SqlFactory)
49 class SqlFactory : public IFactory
50 {
51 public:
52     IUser *createUser() 
53     {
54         return new SqlUser(); // 创建具体产品1(SqlUser)
55     }
56 };
57 
58 // 具体工厂类(AccessFactory)
59 class AccessFactory : public IFactory
60 {
61 public:
62     IUser *createUser()
63     {
64         return new AccessUser(); // 创建具体产品1(AccessUser)
65     }
66 };
67 
68 void main()
69 {
70     IFactory* pFactory = new SqlFactory;
71     IUser* pUser = pFactory->createUser();
72     pUser->getUser();
73     pUser->setUser();
74 
75     delete pFactory;
76     pFactory = new AccessFactory;
77     delete pUser;
78     pUser = pFactory->createUser();
79     pUser->getUser();
80     pUser->setUser();
81 
82     delete pUser;
83     pUser = NULL;
84 
85     system("pause");
86 }
87 
88 // run out:
89 /*
90 在sql中返回user
91 在sql中设置user
92 在Access中返回user
93 在Access中设置user
94 请按任意键继续. . .
95 */

以上代码主要与《抽象工厂模式》对比,为了更好的理解两者之间的区别。

 

Good Good Study, Day Day Up.

顺序 选择 循环 总结

posted @ 2014-08-28 20:35  kaizenly  阅读(435)  评论(0编辑  收藏  举报
打赏