简单工厂模式(C++描述)

本文介绍了简单工厂模式的概念,强调其通过静态工厂方法统一管理对象创建,并以Nokia手机为例,展示了如何使用C++实现简单工厂模式,允许通过XML配置动态选择创建的手机型号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.简单工厂模式又称静态工厂方法模式(Static Factory Method),它不是Gof 所讲的23种设计模式之一,但是它却是我们在编码过程中经常使用的方法之一。

 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。

1.静态工厂方法统一管理对象的创建。
静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割。

2.静态工厂方法推迟了产品的实例化。
通过XML配置文件就能改变具体要创建的产品实例,修改为其它的产品实例,代码不须重新编译。

 

二.简单工厂模式还是有缺点的,后面的工厂方法模式和抽象工厂模式就是对这些缺点的改善。讲完了这三种模式将会有一个对比。以下以Nokia手机为例,采用简单工厂模式设计的源代码雏形。

/* Nokia抽象产品 */  
  1. #pragma once  
  2. #include <string>  
  3. #include <iostream>  
  4. class CNokia  
  5. {  
  6. public:  
  7.     CNokia(void);  
  8.     virtual ~CNokia(void);  
  9. public:  
  10.     virtual bool MakeCall(const std::string & number) const = 0;  
  11. };  
  12. #include "Nokia.h"  
  13.   
  14. CNokia::CNokia(void)  
  15. {  
  16. }  
  17.   
  18. CNokia::~CNokia(void)  
  19. {  
  20. }  
  21.   
  22. #pragma once  
  23. #include "nokia.h"  
  24.   
  25. class CN96 : public CNokia  
  26. {  
  27. public:  
  28.     CN96(void);  
  29.     virtual ~CN96(void);  
  30. public:  
  31.     virtual bool MakeCall(const std::string & number) const;  
  32. };  
  33.   
  34. /* N96型号的Nokia手机产品类 */  
  35. #include "N96.h"  
  36.   
  37. CN96::CN96(void)  
  38. {  
  39.     std::cout << "生产一部N96" << std::endl;  
  40. }  
  41.   
  42. CN96::~CN96(void)  
  43. {  
  44. }  
  45.   
  46. bool CN96::MakeCall(const std::string & number) const  
  47. {  
  48.     std::cout << "我在用N96,拨打号码是:" <<  number.c_str() << std::endl;  
  49.     return false;  
  50. }  
  51.   
  52. #pragma once  
  53. #include "nokia.h"  
  54.   
  55. class CN95 :public CNokia  
  56. {  
  57. public:  
  58.     CN95(void); 
  59.     virtual ~CN95(void);  
  60. public:  
  61.     virtual bool MakeCall(const std::string & number) const;  
  62. };  
  63.   
  64. /* N95型号的Nokia手机产品类 */  
  65. #include "N95.h"  
  66.   
  67. CN95::CN95(void)  
  68. {  
  69.     std::cout << "生产一部N95" << std::endl;  
  70. }  
  71.   
  72. CN95::~CN95(void)  
  73. {  
  74. }  
  75.   
  76. bool CN95::MakeCall(const std::string & number) const  
  77. {  
  78.     std::cout << "我在用N95,拨打号码是:" <<  number.c_str() << std::endl;  
  79.     return false;  
  80. }  
  81.   
  82. /*N85, N81, ...*/  
  83.   
  84. /* 工厂类 */  
  85. #pragma once  
  86. #include "N96.h"  
  87. #include "N95.h"  
  88. #include "N85.h"  
  89. #include "N81.h"  
  90. #include <cassert>  
  91. class CNokiaSimpleFactory  
  92. {  
  93. public:  
  94.     CNokiaSimpleFactory(void);  
  95.     ~CNokiaSimpleFactory(void);  
  96. public:  
  97.          /* 静态工厂方法 */  
  98.     static CNokia * CreateNokia(const std::string & model);  //此处更好的方法是用模板参数T指定类,然后直接return new T;避免if else无止境的增加下去.
  99. };  
  100.   
  101. #include "NokiaSimpleFactory.h"  
  102.   
  103. CNokiaSimpleFactory::CNokiaSimpleFactory(void)  
  104. {  
  105. }  
  106.   
  107. CNokiaSimpleFactory::~CNokiaSimpleFactory(void)  
  108. {  
  109. }  
  110.   
  111. CNokia * CNokiaSimpleFactory::CreateNokia(const std::string & model)  
  112. {  
  113.     if (model == "N96")  
  114.     {  
  115.         return new CN96();  
  116.     }  
  117.     else if (model == "N95")  
  118.     {  
  119.         return new CN95();  
  120.     }  
  121.     else if (model == "N85")  
  122.     {  
  123.         return new CN85();  
  124.     }  
  125.     else if (model == "N81")  
  126.     {  
  127.         return new CN81();  
  128.     }  
  129.     else  
  130.     {  
  131.         assert(false);  
  132.     }  
  133.     return NULL;  
  134. }  
  135.   
  136.   
  137. /* main方法,可以看做客户端 */  
  138. #include "stdafx.h"  
  139. #include "NokiaSimpleFactory.h"  
  140.   
  141. int _tmain(int argc, _TCHAR* argv[])  
  142. {  
  143.     CNokia * nokia = NULL;  
  144.     /*  
  145.           modeName 可以从外部XML文件中读取,运行过程中动态的 
  146.             决定该创建哪一种型号的手机 
  147.     */  
  148.     std::string modeName = "N96";  
  149.     nokia = CNokiaSimpleFactory::CreateNokia(modeName);  
  150.     nokia->MakeCall("123456789");  
  151.     delete nokia;  
  152.     nokia = NULL;  
  153.     return 0;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值