原文: 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. 设计模式 之美 -- 工厂方法模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现如下 C++实现 C语言实现 4. 缺点 1. 解决问题 在简单工厂模式中,我们使用卖衣服进行举例,同一种工厂可以卖很多不同种类的衣服,工厂只是将衣 ...

  2. 工厂方法模式和抽象工厂模式

    工厂方法模式和抽象工厂模式 工厂方法模式 抽象工厂模式 总结: 工厂方法模式 #include <string> #include <iostream>// Abstract ...

  3. 工厂方法模式与抽象工厂模式的区别

    工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类. 一个抽象工厂类,可以派生出多个具体工厂类. 每个具体工厂类只能创建一个具体产品类的实例. 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以 ...

  4. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  5. 设计模式(2)工厂方法模式(Factory Method)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 源码地址 0 工厂方法模式简介 0.0 工厂方法模式定义 工厂方法模式是在简单工厂模式基础上,为解决更复杂的对象创建问题而衍生 ...

  6. 《转》java设计模式--工厂方法模式(Factory Method)

    本文转自:http://www.cnblogs.com/archimedes/p/java-factory-method-pattern.html 工厂方法模式(别名:虚拟构造) 定义一个用于创建对象 ...

  7. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  8. 08Factory Method(工厂方法)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.对象创建模式 通过对象创建模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定,它是接口抽象之后 ...

  9. 工厂方法模式(Factory Method)

    简单工厂(静态工厂方法) 简单工厂实际上不算一种模式,可以把它叫做一种常用写法.例如我们常用的数据库操作,为了适配不同的数据库引擎,可能分别编写了具体的数据库操作类(当然这些类都实现了统一的接口): ...

  10. 设计模式------工厂方法模式

    工厂方法模式定义一个接口用于创建对象,让子类决定哪一个类实例.工厂方法,使一类延迟到其子类的实例. 角色: 1.抽象工厂(Creator)角色: 是工厂方法模式的核心,与应用程序无关. 不论什么在模式 ...

最新文章

  1. PostgreSQL运维实战精讲之“postgresql源码安装”
  2. Spark入门(六)Spark SQL shell启动方式(元数据存储在mysql)
  3. Mac下配置iterm2 支持rz sz命令
  4. linux生成图片快捷方式,在Deepin Linux系统下给AppImage格式软件创建快捷方式的方法...
  5. linux 循环缓冲区 源码,Linux中的循环缓冲区
  6. 关于Eclipse无法显示package Explorer 内容的解决方法
  7. 今天看到一经典的网络小说
  8. overfitting怎么解决?
  9. 矢量叉积与折线段拐向判断---三角形顺逆判断
  10. cad画正弦曲线lisp_如何在AutoCAD中画正弦曲线
  11. 吉比特H2-3光猫破解超级密码
  12. 使用selenium爬取东航余票
  13. 西门子水处理1200PLC程序+触摸屏程序,博图V16学习程序,可仿真实验 Plc程序包含功能块,功能块为SCL编写
  14. 倍福TwinCAT 3 气缸动作程序编写
  15. php模拟用户自动在qq空间发表文章的方法
  16. MT6765/MT6762/MT6761芯片平台支持EVS-SWB?
  17. lisp画示坡线_示坡线画法图文教程
  18. 全球及中国游戏方向盘行业营销动态及销售渠道研究报告(2022-2027)
  19. Bert实战--文本分类(一)
  20. linux udt 源码,UDT linux下关闭链接耗时过长

热门文章

  1. 2023年武汉大学新闻与传播硕士考研上岸前辈备考经验指导
  2. 前序遍历m-ary树_在Ruby中使用ary [index]- object进行数组元素分配
  3. 最高效的学习法:一遍学习法
  4. Hold Fast To Dreams紧紧抓住梦想(双语阅读)
  5. 骨灰级SSM 和spring boot大全(二)
  6. android 模仿qq 上传头像,Android 仿qq上传头像(一)
  7. vsCode JS代码格式化插件ESlint
  8. 基石 GSCOOLINK GSV5010 HDMI2.0视频分配芯片
  9. EfficientNeRF
  10. [iBoard 电子学堂][第〇卷 电子基础]第一篇 认识电子元器件