博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工厂方法模式
阅读量:6883 次
发布时间:2019-06-27

本文共 4244 字,大约阅读时间需要 14 分钟。

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

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

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

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

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

示例代码如下:

1 #include 
2 #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 #include 
2 #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.

顺序 选择 循环 总结

转载地址:http://drjbl.baihongyu.com/

你可能感兴趣的文章
SDL2源码分析1:初始化(SDL_Init())
查看>>
swift通过摄像头读取每一帧的图片,并且做识别做人脸识别
查看>>
你对自己的定位是什么,就能成为什么样的人(转)
查看>>
全文检索引擎Solr系列——整合中文分词组件IKAnalyzer
查看>>
学习mongo系列(二) 新建数据库,collection ,insert(),save()
查看>>
chrome浏览器下用jQuery的load函数来跨域加载页面,响应状态status为(canceled)是什么情况? JSON和JSONP,也许你会豁然开朗,含jQuery用例...
查看>>
Tomcat 配置 HTTPS双向认证
查看>>
ZOJ 3511 Cake Robbery(线段树)
查看>>
[傅里叶变换及其应用学习笔记] 二十三. 线性时不变系统的基本定义
查看>>
iOS 同步GET
查看>>
UItexfile实时验证输入字符
查看>>
JavaScript总结(二) 系统分析
查看>>
CF437D(The Child and Zoo)最小生成树
查看>>
8VC Venture Cup 2016 - Elimination Round D. Jerry's Protest 暴力
查看>>
数据仓库工具:Hive
查看>>
Swift - IBOutlet返回nil(fatal error: unexpectedly found nil while unwrapping an Optional value)
查看>>
Failed to upgrade Oracle Cluster Registry configuration(root.sh)
查看>>
RequestDispatcher 的 forward和include
查看>>
MySQL常用操作总结
查看>>
Sublime text3 插件HTML/CSS/JS prettify 格式化代码
查看>>