设计模式 工厂方法模式
来源:互联网 发布:河南学历网络教育学校 编辑:程序博客网 时间:2024/05/22 09:04
1、factorymethod.h
#ifndef FACTORYMETHOD_H#define FACTORYMETHOD_H#include <iostream>#include <string>using namespace std;class OSProduct //产品,Product,产品的抽象类{public: virtual ~OSProduct(); virtual void Start() = 0;//产品的公共接口。相当于AnOperation};class WindowsProduct : public OSProduct //ConcreteProduct,具体产品实现类{public: virtual void Start();};class LinuxProduct : public OSProduct //ConcreteProduct,具体产品实现类{public: virtual void Start();};class OSCreator //工厂基类,Creator{public: ~OSCreator(); virtual OSProduct* Create() = 0; //FactoryMeothod,工厂方法,生产产品,由子类具体实现};//具体工厂class WindowsCreator : public OSCreator //ConcreteCreator,具体工厂{public: virtual OSProduct* Create();};class LinuxCreator : public OSCreator //ConcreteCreator,具体工厂{public: virtual OSProduct* Create();};//另一种具体工厂:使用模板避免创建多个具体工厂子类template<typename T> class ConcreteCreator : public OSCreator{public: ConcreteCreator(const string strProductType) : m_strProductType(strProductType){}; virtual OSProduct* Create() { cout << "ConcreteCreator. product type: " << m_strProductType << endl; return new T; };protected: string m_strProductType;};#endif // FACTORYMETHOD_H
2、factorymethod.cpp
#include "factorymethod.h"#include <iostream>#include <string>using namespace std;OSProduct::~OSProduct(){}void WindowsProduct::Start(){ cout << "Windows start." << endl;}void LinuxProduct::Start(){ cout << "Linux start." << endl;}OSCreator::~OSCreator(){}OSProduct* WindowsCreator::Create(){ cout << "Create windows…" << endl; return new WindowsProduct;}OSProduct* LinuxCreator::Create(){ cout << "Create linux…" << endl; return new LinuxProduct;}
3、main.cpp
/*作者:jhluroom弹 QQ:454676244 MSN:jhlu0815@hotmail.com开发IDE:qt creater开发环境:QT C++参考网站:神秘果:http://www.shenmiguo.com/定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法(Factory Method)使一个类的实例化延迟到其子类。也叫虚构造器(Virtual Constructor)理解:1.Product是工厂方法生产产品的抽象基类。2.Creator是生产产品的工厂对象抽象基类。Creator提供创建虚方法即工厂方法FactoryMeothod()。FactoryMeothod()由派生类 (ConcreteCreator)具体实现,生产对应的具体产品(ConcreteProduct)。3.ConcreteProduct是继承Product的具体产品。4.ConcreteCreator是生产对应具体产品(ConcreteProduct)的具体工厂。它重新实现继承的工厂方法FactoryMeothod(), 生产具体产品。要点:1.工厂方法模式中,工厂和产品的基类和派生类是平行关系。抽象产品(Product)对应层次是抽象工厂(Creator)。在派生类层次,每个具 体产品(ConcreteProduct)对应一个具体工厂(ConcreteCreator)。换句话说,每新增一个具体产品,就要新增一个对应的具体工厂。2.工厂方法的核心是FactoryMeothod(),每个具体工厂都重新实现该接口,产生具体类对象。3.工厂方法分离客户端和具体类的实现。利用子类(即具体工厂),让子类来决定如何来生产一个具体产品。这样,客户端(即调用者) 只需要知道这个类的抽象类型,由子类去和具体产品类打交道。4.工厂基类中的方法AnOperation(),不是工厂方法,只是供具体工厂实现的公共接口(可以说是工厂对产品的使用行为)。但个人认为, 工厂方法只是生产产品,公共接口的重点应该是产品,因此在产品基类里增加产品使用的公共接口更加实用。5.工厂方法模式的工厂(Creator)若要全局唯一,可以结合单件(Singleton)模式应用。6.关于简单工厂(也叫静态工厂)。工厂方法强调的是“让子类决定实例化什么样的对象”,因为子类知道它们要使用的特定产品。 如果我们将Creator和ConcreteCreator的角色合一,并且将工厂方法FactoryMeothod()静态化,那么就退化成了简单工厂模式应用:1.工厂方法应用场景: 当一个类不知道它所必须创建的对象的类的时候。 当一个类希望由它的子类来指定它所创建的对象的时候。 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。2.OSProduct是产品基类。并且有产品的公共使用接口。 OSCreator是工厂基类。模式结构中的产品使用行为接口AnOperaion并没有出现在工厂基类接口中,放在了产品侧(Start接口)。 具体工厂可以通过继承OSCreator实现,有多少个具体工厂,就要有多少个具体工厂类。 通过C++模板可以避免创建多个具体工厂(模板类ConcreteCreator)。以上文字说明,从网上整理而来,有可能部分与其他同仁相同,请谅解,希望我们能够共同交流,谢谢!*/#include <QtCore/QCoreApplication>#include "factorymethod.h"int main(int argc, char *argv[]){ cout << "=== jhluroom start ========" << endl; OSCreator* pCreator = NULL; OSProduct *pProduct = NULL; pCreator = new WindowsCreator; pProduct = pCreator->Create(); pProduct->Start(); delete pProduct; delete pCreator; pCreator = new LinuxCreator; pProduct = pCreator->Create(); pProduct->Start(); delete pProduct; delete pCreator; cout<<endl; //另一种实现具体工厂方式:使用模板避免创建子类 ConcreteCreator<WindowsProduct> windowsCreator("windows"); pProduct = windowsCreator.Create(); pProduct->Start(); delete pProduct; ConcreteCreator<LinuxProduct> linuxCreator("linux"); pProduct = linuxCreator.Create(); pProduct->Start(); delete pProduct; cout << "=== jhluroom finish _^_ ===" << endl; return 0;}运动结果:
=== jhluroom start ========
Create windows…
Windows start.
Create linux…
Linux start.
ConcreteCreator. product type: windows
Windows start.
ConcreteCreator. product type: linux
Linux start.
=== jhluroom finish _^_ ===
- 设计模式--工厂方法
- 工厂方法设计模式
- 设计模式-工厂方法
- 【设计模式】【工厂方法】
- 设计模式 - 工厂方法
- 工厂方法设计模式
- 工厂方法设计模式
- 【设计模式】工厂方法
- 设计模式--工厂方法
- 设计模式---工厂方法
- 设计模式-工厂方法
- 工厂方法设计模式
- 工厂方法设计模式
- 设计模式-工厂方法
- 设计模式 工厂方法
- 工厂方法设计模式
- 工厂方法设计模式
- 设计模式 - 工厂方法
- 设计模式 模板方法模式
- 设计模式 访问者模式
- 常用linux命令总结
- 设计模式 抽象工厂模式
- android笔记 编程心得
- 设计模式 工厂方法模式
- 单例模式学习博客
- Android 一些方法的触发
- MySQL(二)
- Gnome快捷键 Ubuntu快捷键
- android xml属性的单位大全
- 事件冒泡详解
- ZOJ1109 Language of FatMouse,BST
- android 拖放功能