工厂方法模式
2017-04-25 10:47
204 查看
工厂方法模式:定义了一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延期到其子类
在学习工厂方法模式之前,先回忆前面学的简单工厂模式;
简单工厂模式就是将对象的创建和逻辑的判断都交给了一个工厂类去做,这样做的优点是客户端不需要知道具体产品类的类名和具体产品的生产过程,达到分离的目的;
但是简单工厂模式的缺点也是不容忽略的,那就是工厂类的责任太过重大,而且如果产品类比较多的话,判断逻辑也会比较复杂,使系统的逻辑变得难理解;
工厂方法模式是属于GoF23种模式中的一种,它是基于简单工厂模式的设计模式,不过不同的是,工厂方法模式继承了简单工厂方法的优点,同时也没有简单工厂方法的缺点,即造成工厂类的复杂逻辑;而且如果要添加新的产品类的话,就不得不去修改工厂类的逻辑,违背了开闭原则,这是 我们不希望看到的;
那么,工厂方法模式到底是怎么做到这点的呢,下面我们先来看看工厂方法模式的定义;
工厂方法模式:工厂方法模式又称为工厂模式,它属于创建型模式;在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生产具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟该实例化哪一个具体产品类;
C++ 伪代码来简单实现
在学习工厂方法模式之前,先回忆前面学的简单工厂模式;
简单工厂模式就是将对象的创建和逻辑的判断都交给了一个工厂类去做,这样做的优点是客户端不需要知道具体产品类的类名和具体产品的生产过程,达到分离的目的;
但是简单工厂模式的缺点也是不容忽略的,那就是工厂类的责任太过重大,而且如果产品类比较多的话,判断逻辑也会比较复杂,使系统的逻辑变得难理解;
工厂方法模式是属于GoF23种模式中的一种,它是基于简单工厂模式的设计模式,不过不同的是,工厂方法模式继承了简单工厂方法的优点,同时也没有简单工厂方法的缺点,即造成工厂类的复杂逻辑;而且如果要添加新的产品类的话,就不得不去修改工厂类的逻辑,违背了开闭原则,这是 我们不希望看到的;
那么,工厂方法模式到底是怎么做到这点的呢,下面我们先来看看工厂方法模式的定义;
工厂方法模式:工厂方法模式又称为工厂模式,它属于创建型模式;在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生产具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟该实例化哪一个具体产品类;
C++ 伪代码来简单实现
#include "stdafx.h" #include<iostream> using namespace std; //TV是抽象产品类 class TV { public: //纯虚函数,抽象基类,公共方法; virtual void play() = 0; virtual ~TV() //注意将基类的析构函数设为虚函数 { cout<<"~TV"<<endl; } }; class Hair:public TV { public: void play() { cout<<"Hair tv working!"<<endl; } ~Hair() { cout<<"~Hair"<<endl; } }; class TCL:public TV { public: void play() { cout<<"TCL tv working!"<<endl; } ~TCL() { cout<<"~TCL"<<endl; } }; //抽象工厂是用来生成产品的抽象接口 class BaseFactory { public: //纯虚函数,抽象类; virtual TV* product() = 0; virtual ~BaseFactory() //注意将基类的析构函数设为虚函数 { cout<<"~BaseFactory"<<endl; } }; class SonHairFactory:public BaseFactory { public: TV* product() { //Hair子工厂返回Hair产品对象; //这里其实最好使用智能指针来维护这个对象,因为C++没有Java的垃圾回收机制 //容易造成内存泄漏; cout<<"Hair tv being producted!"<<endl; return new Hair(); } ~SonHairFactory() { cout<<"~SonHairFactory"<<endl; } }; class SonTCLFactory:BaseFactory { public: TV* product() { cout<<"TCL tv being producted!"<<endl; return new TCL(); } ~SonTCLFactory() { cout<<"~SonTCLFactory"<<endl; } }; //我们直接以main函数来模拟客户端; int main() { //注意,C++千万不要写成TV tv,会被笑的,抽象基类不可以不实例化; TV* tv; BaseFactory* factory; //C++的话现在只能将子工厂类名暴露出来了 factory = new SonHairFactory(); tv = factory->product(); //生产的对象传给tv指针,Java的话直接是对象; tv->play(); //释放空间; Java不需要,有垃圾回收机制; delete(tv); delete(factory); system("pause"); return 0; }
相关文章推荐
- (2)设计模式之工厂方法模式(创建型模式)
- 设计模式——工厂方法模式(Factory Method)
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 工厂模式---工厂方法模式
- 23种设计模式之工厂方法模式
- Head First 设计模式学习——简单工厂方法-工厂方法模式-抽象工厂模式
- C++设计模式——工厂方法模式
- 工厂方法模式
- 1-4 工厂模式(工厂方法模式/抽象工厂模式)
- 工厂方法模式
- 对 桥接模式 的个人理解,以及与 工厂方法模式、建造者模式 的结合运用
- Java 工厂方法模式
- 《大话设计模式》——读后感 (5)雷锋依然在人间?——工厂方法模式
- 24天学会设计模式------工厂方法模式
- 工厂方法模式
- 23种设计模式(2):工厂方法模式
- 工厂方法模式(factory method)c++版本
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- (五)工厂方法模式
- 大话设计模式笔记(五)——代理模式和工厂方法模式