码迷,mamicode.com
首页 > 其他好文 > 详细

2 创建型模式-----工厂方法模式

时间:2015-05-28 17:43:38      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

简单工厂模式的不足:加入新产品的同时需要修改工厂类,违背“开闭原则”。

模式动机:增加一个抽象工厂类,再定义具体工厂类来生产具体的产品,增加新产品时只需要添加产品类和对应的具体工厂类即可。由于我们是对抽象工厂进行编程,因此可以在不修改抽象工厂的前提下增加新产品。

模式定义:工厂方法模式(Factory Method Pattern)又称工厂模式、虚构造器。该模式下,抽象工厂负责创建产品的公共接口,具体工厂继承自该接口来具体生产产品,这样就相当于将产品的实例化延迟到工厂子类中完成。

模式结构图:

技术分享

 

模式实例:

假设一个电视机生产商需要生产Haier和Hisense两种电视机,那么需要:

1>  建立一个TVFactory抽象工厂负责提供生产电视机的接口;

2>  分别建立生产Haier和Hisense两种电视机的子工厂HaierTVFactory和HisenseTVFactory;

3>  建立抽象电视机接口TV;

4>  建立具体电视机HaierTV和HisenseTV实现这个TV接口

然后生产商只需要与抽象接口TVFactory与TV交互就可以了,如果在增加一个电视机种类,则分别加入对应的子类即可,无需更改抽象类,如此,很好地满足了“开闭原则”。其结构图如下:

技术分享

 

 

模式代码:

bt_工厂方法模式.h:

 1 #ifndef FMP_H
 2 #define FMP_H
 3 
 4 #include <iostream>
 5 
 6 class TV                            // 定义电视机产品接口
 7 {
 8 public:
 9     virtual ~TV();
10     virtual void play() = 0;
11 };
12 TV::~TV(){ }
13 
14 class HaierTV : public TV           // 具体的Haier电视机类
15 {
16 public:
17     virtual void play();
18 };
19 void HaierTV::play(){ }
20 
21 class HisenseTV : public TV           // 具体的Hisense电视机类
22 {
23 public:
24     virtual void play();
25 };
26 void HisenseTV::play(){ }
27 
28 /* *********************************************************************** */
29 
30 class TVFactory                     // 定义抽象工厂
31 {
32 public:
33     virtual ~TVFactory();
34     virtual TV* produceTV() = 0;    // 生产电视机的接口
35 };
36 TVFactory::~TVFactory(){ }
37 
38 class HaierTVFactory : public TVFactory     // 定义生产Haier电视机的工厂
39 {
40 public:
41     virtual TV* produceTV();
42 };
43 TV* HaierTVFactory::produceTV()             // 具体生产Haier电视机
44 {
45     std::cout << "生产了一台Haier电视机" << std::endl;
46     return new HaierTV;
47 }
48 
49 class HisenseTVFactory : public TVFactory     // 定义生产Hisense电视机的工厂
50 {
51 public:
52     virtual TV* produceTV();
53 };
54 TV* HisenseTVFactory::produceTV()             // 具体生产Hisense电视机
55 {
56     std::cout << "生产了一台Hisense电视机" << std::endl;
57     return new HisenseTV;
58 }
59 
60 #endif // FMP_H

 

bt_工厂方法模式.cpp:

 1 #include <iostream>
 2 #include "bt_工厂方法模式.h"
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     // 客户端生产电视机时只需和抽象工厂与抽象电视机交互即可
 9     TVFactory* factory;
10     factory = new HaierTVFactory;   // Haier工厂
11     TV* tv;
12     tv = factory->produceTV();         // 多态调用
13 
14     factory = new HisenseTVFactory;  // Hisense工厂
15     tv = factory->produceTV();
16 
17     delete factory;
18     delete tv;
19 
20     return 0;
21 }
技术分享

 

模式优缺点:

  • 客户创建具体产品时只需和具体工厂打交道,无需关注产品创建细节;在系统中加入新产品时,只需添加产品类和具体工厂类,无需修改抽象工厂与抽象产品类,而这就意味着无需修改与用户接口,系统扩展性提高,符合“开闭原则”。
  • 缺点是每次增加一个新产品需要添加两个具体类,如果产品种类很多,系统就会变得臃肿。

 

 

 

2 创建型模式-----工厂方法模式

标签:

原文地址:http://www.cnblogs.com/benxintuzi/p/4536320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!