标签:
简单工厂模式的不足:加入新产品的同时需要修改工厂类,违背“开闭原则”。
模式动机:增加一个抽象工厂类,再定义具体工厂类来生产具体的产品,增加新产品时只需要添加产品类和对应的具体工厂类即可。由于我们是对抽象工厂进行编程,因此可以在不修改抽象工厂的前提下增加新产品。
模式定义:工厂方法模式(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 }
模式优缺点:
标签:
原文地址:http://www.cnblogs.com/benxintuzi/p/4536320.html