工厂方法模式


工厂方法模式是对简单工厂模式的改进。首先看看简单工厂模式的缺点。
软件是之所以区别于程序,是因为它可以被人们使用,并能间接创造效益。需求是软件开发的核心,忽视用户的需求,软件本身就没有存在的价值。

假如Nokia又新开发了一款新手机N99,对于采用简单工厂模式设计的系统,我们的做法是:
1.新增一个CN99类继承自CNokia抽象类,这个符合OCP原则。
注:OCP:Open-Closed Principle开闭原则。OCP关注的是灵活性,改动是通过增加代码进行的,而不是改动现有的代码。对扩展开放,对修改关闭。


2.修改静态工厂方法中的判断逻辑,增加对N99的创建代码。这个明显违背OCP。

改进简单工厂模式,我们要做的就是克服2中的缺点。


下面的工厂方法模式,新增一个N96的工厂类,不用修改已有的代码,完全支持OCP原则,而且工厂方法模式也完全遵守里氏替换原则,LSP原则是OCP成为可能的重要原则。
注:Liskov Substitution Principle(里氏代换原则):子类型(subtype)必须能够替换它们的基类型。

 

虽然工厂方法模式是对简单工厂模式缺点的该进,这个缺点就是违背软件设计原则OCP。但是并不是工厂方法模式就优于简单工厂模式,只不过后者更符合常规的软件设计理念。 

[cpp]  view plain copy
  1. /* 抽象工厂类 */  
  2. #pragma once  
  3. #include "Nokia.h"  
  4. class CFactoryMethod  
  5. {  
  6. public:  
  7.     CFactoryMethod(void);  
  8. public:  
  9.     virtual ~CFactoryMethod(void);  
  10. public:  
  11.     virtual CNokia * CreateNokiaMobile(void) = 0;  
  12. };  
  13.   
  14. #include "FactoryMethod.h"  
  15.   
  16. CFactoryMethod::CFactoryMethod(void)  
  17. {  
  18. }  
  19.   
  20. CFactoryMethod::~CFactoryMethod(void)  
  21. {  
  22. }  
  23.   
  24. /* 生产N99的具体工厂类 */  
  25. #pragma once  
  26. #include "factorymethod.h"  
  27. #include "N96.h"  
  28. class CN96Factory :  
  29.     public CFactoryMethod  
  30. {  
  31. public:  
  32.     CN96Factory(void);  
  33. public:  
  34.     virtual ~CN96Factory(void);  
  35. public:  
  36.     virtual CNokia * CreateNokiaMobile(void);  
  37. };  
  38.   
  39. #include "N96Factory.h"  
  40.   
  41. CN96Factory::CN96Factory(void)  
  42. {  
  43. }  
  44.   
  45. CN96Factory::~CN96Factory(void)  
  46. {  
  47. }  
  48.   
  49. CNokia * CN96Factory::CreateNokiaMobile(void)  
  50. {  
  51.     return new CN96();  
  52. }  
  53.   
  54. /* 客户端通过建立N99工厂生产Nokia手机 */  
  55. #include "stdafx.h"  
  56. #include "N96Factory.h"  
  57. int _tmain(int argc, _TCHAR* argv[])  
  58. {  
  59.     CFactoryMethod * factoryMethod = new CN96Factory();  
  60.     CNokia * nokia = factoryMethod->CreateNokiaMobile();  
  61.     nokia->MakeCall("1234567");  
  62.     return 0;  
  63. }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值