【1】什么是工厂方法模式?
定义一个创建产品对象的工厂接口(IFactory),将实际创建工作推迟到子类(addFactory、subFactory、mulFactory、divFactory)当中。
核心工厂类(IFactory)不再负责产品的创建,仅作为一个抽象(有纯虚方法)工厂角色,只负责声明具体工厂子类必须实现的接口(即纯虚方法)。
这样进一步抽象化的好处:系统在不需要修改具体工厂角色的情况下引进新的产品(与简单工厂模式相比)。
【2】工厂方法模式代码示例
示例代码如下:
1 #include2 #include 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 IFactory108 {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 891132 请按任意键继续. . .133 */
【3】工厂方法模式示例代码
代码如下:
1 #include2 #include 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 IUser15 {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 IUser29 {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 IFactory43 {44 public:45 virtual IUser *createUser() = 0;46 };47 48 // 具体工厂类(SqlFactory)49 class SqlFactory : public IFactory50 {51 public:52 IUser *createUser() 53 {54 return new SqlUser(); // 创建具体产品1(SqlUser)55 }56 };57 58 // 具体工厂类(AccessFactory)59 class AccessFactory : public IFactory60 {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中返回user91 在sql中设置user92 在Access中返回user93 在Access中设置user94 请按任意键继续. . .95 */
以上代码主要与《抽象工厂模式》对比,为了更好的理解两者之间的区别。
Good Good Study, Day Day Up.
顺序 选择 循环 总结