工厂方法模式
2016-02-26 10:45
204 查看
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现“开-闭 原则”,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Template Method pattern)应用。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现“开-闭 原则”,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Template Method pattern)应用。
#include <string> #include <iostream> //小米手机产品类 class IXiaoMi { public: IXiaoMi(void); public: virtual ~IXiaoMi(void); public: virtual bool MakeCall(const std::string & number) const = 0; }; IXiaoMi::IXiaoMi(void) { } IXiaoMi::~IXiaoMi(void) { } //小米2型号的小米手机产品类 class CXiaoMi2 : public IXiaoMi { public: CXiaoMi2(void); public: virtual ~CXiaoMi2(void); public: virtual bool MakeCall(const std::string & number) const; }; CXiaoMi2::CXiaoMi2(void) { std::cout << "生产一部小米2" << std::endl; } CXiaoMi2::~CXiaoMi2(void) { } bool CXiaoMi2::MakeCall(const std::string & number) const { std::cout << "我在用小米2,拨打号码是:" << number.c_str() << std::endl; return false; } // class CFactoryMethod { public: CFactoryMethod(void); public: virtual ~CFactoryMethod(void); public: virtual IXiaoMi * CreateXiaoMiPhone(void) = 0; }; CFactoryMethod::CFactoryMethod(void) { } CFactoryMethod::~CFactoryMethod(void) { } //小米2的工厂 class CXiaoMi2Factory : public CFactoryMethod { public: CXiaoMi2Factory(void); public: virtual ~CXiaoMi2Factory(void); public: virtual IXiaoMi * CreateXiaoMiPhone(void); }; CXiaoMi2Factory::CXiaoMi2Factory(void) { } CXiaoMi2Factory::~CXiaoMi2Factory(void) { } IXiaoMi * CXiaoMi2Factory::CreateXiaoMiPhone(void) { return new CXiaoMi2(); } //客户端通过建立小米2工厂生产小米手机 int main() { CFactoryMethod *pMethod = new CXiaoMi2Factory(); IXiaoMi *pXiaoMi = pMethod->CreateXiaoMiPhone(); pXiaoMi->MakeCall("123456789"); if (pMethod) { delete pMethod; pMethod=0; } if (pXiaoMi) { delete pXiaoMi; pXiaoMi=0; } return 0; }
相关文章推荐
- Android Graphics(二):路径及文字
- 数据结构与算法学习笔记(二)
- Android 查看图库指定路径的最新照片
- NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索
- 基于云计算Iaas平台的ZStack
- js读取cookie信息
- Linux命令行删除文件到回收站
- SD卡CSD version2解析
- CodeForces 617 C. Watering Flowers(水~)
- app.use
- js解决千分符问题
- 几个比较黑的名词
- maven 报错 Missing artifact net.sf.json-lib:json-lib:jar:2.1
- Apach配置本地域名
- js脚本语言在页面上不执行
- 【转】EasyUI 验证
- 《leetCode》:Binary Tree Zigzag Level Order Traversal
- Your build settings specify a provisioning profile with the UUID
- codeforces-580B Kefa and Company(二分)
- 诶,很有意思的点子——云适配