C++ 工厂方法模式
原文: https://blog.csdn.net/liang19890820/article/details/70652858
简述
工厂方法模式(Factory Method Pattern)是一种常用的对象创建型设计模式,此模式的核心思想是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用以及方便后期维护拓展的目的。
模式结构
UML 结构图:
- Factory(抽象工厂):是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
- ConcreteFactory(具体工厂):实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且被应用程序调用以创建产品对象。
- Product(抽象产品):所创建对象的基类,也就是具体产品的共同父类或共同拥有的接口。
- ConcreteProduct(具体产品):实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
优缺点
优点:
- 克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。所以说,“工厂方法模式”是“简单工厂模式”的进一步抽象和推广。
缺点:
- 每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。
适用场景
- 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
- 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程对于使用者来说是透明的。
案例分析
工厂模式基本和简单工厂模式差不多,简单工厂模式 - 在产品子类添加时,需要添加一个判断分支,这违背了开放-封闭原则。因此,工厂模式就是为了解决这个问题而产生的。
所以,对于 简单工厂模式 一节中的 BBA 来说,要分别由对应的工厂来生产。
代码实现
创建抽象产品
在我们的示例中,需要有一个汽车产品 - ICar:
// product.h
#ifndef PRODUCT_H
#define PRODUCT_H#include <string>using namespace std;// 汽车接口
class ICar
{
public:virtual string Name() = 0; // 汽车名称
};#endif // PRODUCT_H
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
创建具体产品
有了抽象产品,继续为其创建一些具体的产品:
// concrete_product.h
#ifndef CONCRETE_PRODUCT_H
#define CONCRETE_PRODUCT_H#include "product.h"// 奔驰汽车
class BenzCar : public ICar
{
public:string Name() {return "Benz Car";}
};// 宝马汽车
class BmwCar : public ICar
{
public:string Name() {return "Bmw Car";}
};// 奥迪汽车
class AudiCar : public ICar
{
public:string Name() {return "Audi Car";}
};#endif // CONCRETE_PRODUCT_H
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
创建工厂
产品有了,当然要有相应的工厂来生产,但在这之前,需要一个抽象工厂:
// factory.h
#ifndef FACTORY_H
#define FACTORY_H#include "product.h"// 工厂接口
class AFactory
{public:virtual ICar* CreateCar() = 0; // 生产汽车
};#endif // FACTORY_H
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
创建具体工厂
为每个制造商创建对应的的工厂:
// concrete_factory.h
#ifndef CONCRETE_FACTORY_H
#define CONCRETE_FACTORY_H#include "factory.h"
#include "concrete_product.h"// 奔驰工厂
class BenzFactory : public AFactory
{
public:ICar* CreateCar() {return new BenzCar();}
};// 宝马工厂
class BmwFactory : public AFactory
{
public:ICar* CreateCar() {return new BmwCar();}
};// 奥迪工厂
class AudiFactory : public AFactory
{
public:ICar* CreateCar() {return new AudiCar();}
};#endif // CONCRETE_FACTORY_H
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
这样以来,每个工厂只负责生产自己的产品。
创建客户端
当一切准备就绪,就可以实现客户端了:
// main.cpp
#include "concrete_factory.h"
#include "product.h"
#include <iostream>#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endifint main()
{// 奔驰AFactory *pFactory = new BenzFactory();ICar *pCar = pFactory->CreateCar();cout << "Benz factory: " << pCar->Name() << endl;SAFE_DELETE(pCar);SAFE_DELETE(pFactory);// 宝马pFactory = new BmwFactory();pCar = pFactory->CreateCar();cout << "Bmw factory: " << pCar->Name() << endl;SAFE_DELETE(pCar);SAFE_DELETE(pFactory);// 奥迪pFactory = new AudiFactory();pCar = pFactory->CreateCar();cout << "Audi factory: " << pCar->Name() << endl;SAFE_DELETE(pCar);SAFE_DELETE(pFactory);getchar();return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
输出如下:
Benz factory: Benz Car
Bmw factory: Bmw Car
Audi factory: Audi Car
C++ 工厂方法模式相关推荐
- 设计模式 之美 -- 工厂方法模式
文章目录 1. 解决问题 2. 应用场景 3. 实现如下 C++实现 C语言实现 4. 缺点 1. 解决问题 在简单工厂模式中,我们使用卖衣服进行举例,同一种工厂可以卖很多不同种类的衣服,工厂只是将衣 ...
- 工厂方法模式和抽象工厂模式
工厂方法模式和抽象工厂模式 工厂方法模式 抽象工厂模式 总结: 工厂方法模式 #include <string> #include <iostream>// Abstract ...
- 工厂方法模式与抽象工厂模式的区别
工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类. 一个抽象工厂类,可以派生出多个具体工厂类. 每个具体工厂类只能创建一个具体产品类的实例. 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以 ...
- 设计模式之工厂方法模式(Factory Method)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...
- 设计模式(2)工厂方法模式(Factory Method)
设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 源码地址 0 工厂方法模式简介 0.0 工厂方法模式定义 工厂方法模式是在简单工厂模式基础上,为解决更复杂的对象创建问题而衍生 ...
- 《转》java设计模式--工厂方法模式(Factory Method)
本文转自:http://www.cnblogs.com/archimedes/p/java-factory-method-pattern.html 工厂方法模式(别名:虚拟构造) 定义一个用于创建对象 ...
- 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细
1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...
- 08Factory Method(工厂方法)模式
技术交流QQ群:1027579432,欢迎你的加入! 1.对象创建模式 通过对象创建模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定,它是接口抽象之后 ...
- 工厂方法模式(Factory Method)
简单工厂(静态工厂方法) 简单工厂实际上不算一种模式,可以把它叫做一种常用写法.例如我们常用的数据库操作,为了适配不同的数据库引擎,可能分别编写了具体的数据库操作类(当然这些类都实现了统一的接口): ...
- 设计模式------工厂方法模式
工厂方法模式定义一个接口用于创建对象,让子类决定哪一个类实例.工厂方法,使一类延迟到其子类的实例. 角色: 1.抽象工厂(Creator)角色: 是工厂方法模式的核心,与应用程序无关. 不论什么在模式 ...
最新文章
- PostgreSQL运维实战精讲之“postgresql源码安装”
- Spark入门(六)Spark SQL shell启动方式(元数据存储在mysql)
- Mac下配置iterm2 支持rz sz命令
- linux生成图片快捷方式,在Deepin Linux系统下给AppImage格式软件创建快捷方式的方法...
- linux 循环缓冲区 源码,Linux中的循环缓冲区
- 关于Eclipse无法显示package Explorer 内容的解决方法
- 今天看到一经典的网络小说
- overfitting怎么解决?
- 矢量叉积与折线段拐向判断---三角形顺逆判断
- cad画正弦曲线lisp_如何在AutoCAD中画正弦曲线
- 吉比特H2-3光猫破解超级密码
- 使用selenium爬取东航余票
- 西门子水处理1200PLC程序+触摸屏程序,博图V16学习程序,可仿真实验 Plc程序包含功能块,功能块为SCL编写
- 倍福TwinCAT 3 气缸动作程序编写
- php模拟用户自动在qq空间发表文章的方法
- MT6765/MT6762/MT6761芯片平台支持EVS-SWB?
- lisp画示坡线_示坡线画法图文教程
- 全球及中国游戏方向盘行业营销动态及销售渠道研究报告(2022-2027)
- Bert实战--文本分类(一)
- linux udt 源码,UDT linux下关闭链接耗时过长
热门文章
- 2023年武汉大学新闻与传播硕士考研上岸前辈备考经验指导
- 前序遍历m-ary树_在Ruby中使用ary [index]- object进行数组元素分配
- 最高效的学习法:一遍学习法
- Hold Fast To Dreams紧紧抓住梦想(双语阅读)
- 骨灰级SSM 和spring boot大全(二)
- android 模仿qq 上传头像,Android 仿qq上传头像(一)
- vsCode JS代码格式化插件ESlint
- 基石 GSCOOLINK GSV5010 HDMI2.0视频分配芯片
- EfficientNeRF
- [iBoard 电子学堂][第〇卷 电子基础]第一篇 认识电子元器件