设计模式之c++实现(三)
2016-07-13 20:05
447 查看
工厂方法模式
工厂方法模式定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不负责产品的创建,成为一个抽象角色,仅负责具体工厂子类必须实现的接口。
实现了可扩展。
factory.h
#ifndef __FACTORY_H_ #define __FACTORY_H_ #include "simplefactory.h" class FactoryBase { public: //声明工厂子类必须实现的接口,不负责产品的创建 virtual CarBase* createCar() = 0; }; //将实际创建工作推迟到子类 class GMFactory : public FactoryBase { public: CarBase* createCar() { return new GMCar(); } }; class FordFactory : public FactoryBase { public: CarBase* createCar() { return new FordCar(); } }; class ToyotaFactory : public FactoryBase { public: CarBase* createCar() { return new ToyotaCar(); } }; #endif
测试代码
#include "factory.h" int main() { GMFactory f1; FordFactory f2; ToyotaFactory f3; FactoryBase* pfactory = &f1; CarBase* pcar = pfactory->createCar(); pcar->printName(); delete pcar; pfactory = &f2; pcar = pfactory->createCar(); pcar->printName(); delete pcar; pfactory = &f3; pcar = pfactory->createCar(); pcar->printName(); delete pcar; return 0; }
使用工厂方法虽然进行了解耦,是程序更加灵活,但是太多工厂类带来了类膨胀的后果。
采用模板工厂模式
factory.h 中添加模板
class CarFactoryBase { public: template<class Tcar> static CarBase* createCar() { return new Tcar(); } };
测试代码
#include "factory.h" int main() { CarBase* pcar = CarFactoryBase::createCar<GMCar>(); pcar->printName(); delete pcar; pcar = CarFactoryBase::createCar<ToyotaCar>(); pcar->printName(); delete pcar; pcar = CarFactoryBase::createCar<FordCar>(); pcar->printName(); delete pcar; return 0; }
然而,工厂方法可以用于更加复杂的对象创建过程。耦合性非常低,易于扩展。工厂方法符合了面向对象的开放-封闭原则(OCP)。
软件实体应该是可扩展,而不可修改的。也就是说对扩展是开放的,而对修改是封闭的。
相关文章推荐
- C语言的值传递、地址传递、引用传递
- 扩展欧几里德算法解线性方程ax+by=c [模板]
- 调用C++11编译器 //支持c++11
- C语言的回调函数
- 设计模式之c++实现(二)
- C++中的运算符重载
- NYOJ 一种排序问题
- 1061. Dating (20)
- 【c++】线程thread类
- NYOJ 大数阶乘问题
- c++11多线程 互斥量
- C++ 创建动态二维数组
- C/C++语言参数传递----值传递、引用传递、指针传递、指针引用传递
- java的数据类型与c语言的区别
- 图解VC++版PE文件解析器源码分析
- 136. Single Number
- C++11 long long使用及输出
- boost静态链接库和c++/clr不兼容问题:未能加载文件或程序集,不是有效的Win32应用程序。
- LeetCode:Implement strStr()
- C++中的对齐方式及sizeof小结