设计模式之c++实现(三)
来源:互联网 发布:淘宝网店的名字怎么起 编辑:程序博客网 时间:2024/05/19 09:10
工厂方法模式
工厂方法模式定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不负责产品的创建,成为一个抽象角色,仅负责具体工厂子类必须实现的接口。
实现了可扩展。
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)。
软件实体应该是可扩展,而不可修改的。也就是说对扩展是开放的,而对修改是封闭的。
0 0
- 设计模式之c++实现(三)
- 设计模式之适配器模式(三种实现) JAVA
- 常见设计模式的解析和实现(C++)之三-Builder模式
- 常见设计模式的解析和实现(C++)之三-Builder模式
- 常见设计模式的解析和实现(C++)之三-Builder模式
- 常见设计模式的解析和实现(C++)之三-Builder模式
- 设计模式的解析和实现(C++)之三-Builder模式
- 设计模式之C#实现(三)FactoryMethod
- 设计模式之C#实现(三)FactoryMethod
- 设计模式之C#实现(三)FactoryMethod
- 设计模式之C#实现(三)FactoryMethod
- 设计模式之C#实现(三)FactoryMethod
- 设计模式实现(三)---装饰模式
- 设计模式之备忘录模式(三)
- 设计模式之(三)Proxy模式
- 设计模式之观察者模式(三)
- 设计模式(三)之访问者模式
- 设计模式之单例模式三种实现
- day_3-acm贪心(sort结构体排序)
- 走进VR游戏开发的世界
- 将 Web 应用性能提高十倍的10条建议
- Linux基础知识的学习(三)
- codeforces #630 I. Parking Lot
- 设计模式之c++实现(三)
- android自定义 数字键盘2
- Spring (四) AOP详解
- javascript原理系列— new的原理
- 转换到 COFF 期间失败: 文件无效或损坏
- 快速学习ggplot2
- hdu3599(最短路+网络流)
- 5-5 有理数均值
- 两种分布式锁实现方案