简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板

文章目录

  • 前言
  • 代码仓库
  • 简单工厂模式(Simple Factory)
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)
  • 总结
  • 参考资料
  • 作者的话

前言

简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板。


代码仓库

  • yezhening/Programming-examples: 编程实例 (github.com)
  • Programming-examples: 编程实例 (gitee.com)

简单工厂模式(Simple Factory)

结构

  • 抽象产品类
  • 具体产品类 A
  • 具体产品类 B
  • 简单工厂类
  • 简单工厂类的静态方法创建具体产品对象 A 和具体产品对象 B

核心

  • 继承
  • 多态
  • 一个工厂创建多类产品

代码

#include <iostream>
#include <string>
#include <memory>using std::cerr;
using std::cout;
using std::endl;
using std::make_unique;
using std::string;
using std::unique_ptr;// 抽象产品类
class AbstractProduct
{
public:AbstractProduct() = default;virtual ~AbstractProduct() = default;virtual void func() = 0;
};// 具体产品类 A
class ConcreteProductA : public AbstractProduct
{
public:ConcreteProductA() = default;~ConcreteProductA() override = default;void func() override{cout << "ConcreteProductA" << endl;}
};// 具体产品类 B
class ConcreteProductB : public AbstractProduct
{
public:ConcreteProductB() = default;~ConcreteProductB() override = default;void func() override{cout << "ConcreteProductB" << endl;}
};// 简单工厂类
class SimpleFactory
{
public:// 静态方法依据类型创建不同的具体产品static unique_ptr<AbstractProduct> create_concrete_product(const string &concrete_product_type){if (concrete_product_type == "A"){return make_unique<ConcreteProductA>();}else if (concrete_product_type == "B"){return make_unique<ConcreteProductB>();}else{cerr << "Unknown type of concrete product" << endl;return nullptr;}}
};// 客户端
int main()
{// 使用简单工厂创建不同类型的具体产品unique_ptr<AbstractProduct> concrete_product_a = SimpleFactory::create_concrete_product("A"); // 创建具体产品对象 Aif (concrete_product_a != nullptr){concrete_product_a->func();}unique_ptr<AbstractProduct> concrete_product_b = SimpleFactory::create_concrete_product("B"); // 创建具体产品对象 Bif (concrete_product_b != nullptr){concrete_product_b->func();}unique_ptr<AbstractProduct> concrete_product_c = SimpleFactory::create_concrete_product("C"); // 创建具体产品对象 Cif (concrete_product_c != nullptr){concrete_product_c->func();}return 0;
}
/*
输出:
ConcreteProductA
ConcreteProductB
Unknown type of concrete product
*/

工厂方法模式(Factory Method)

结构

  • 抽象产品类
  • 具体产品类 A
  • 具体产品类 B
  • 抽象工厂类
  • 具体工厂类 A
  • 具体工厂类 B
  • 具体工厂对象 A 的方法创建具体产品对象 A
  • 具体工厂对象 B 的方法创建具体产品对象 B

核心

  • 继承
  • 多态
  • 一类工厂创建一类产品

代码

#include <iostream>
#include <memory>using std::cout;
using std::endl;
using std::make_unique;
using std::unique_ptr;// 抽象产品类
class AbstractProduct
{
public:AbstractProduct() = default;virtual ~AbstractProduct() = default;virtual void func() = 0;
};// 具体产品类 A
class ConcreteProductA : public AbstractProduct
{
public:ConcreteProductA() = default;~ConcreteProductA() override = default;void func() override{cout << "ConcreteProductA" << endl;}
};// 具体产品类 B
class ConcreteProductB : public AbstractProduct
{
public:ConcreteProductB() = default;~ConcreteProductB() override = default;void func() override{cout << "ConcreteProductB" << endl;}
};// 抽象工厂类
class AbstractFactory
{
public:AbstractFactory() = default;virtual ~AbstractFactory() = default;virtual unique_ptr<AbstractProduct> create_concrete_product() const = 0;
};// 具体工厂类 A
class ConcreteFactoryA : public AbstractFactory
{
public:ConcreteFactoryA() = default;~ConcreteFactoryA() override = default;inline unique_ptr<AbstractProduct> create_concrete_product() const override{return make_unique<ConcreteProductA>();}
};// 具体工厂类 B
class ConcreteFactoryB : public AbstractFactory
{
public:ConcreteFactoryB() = default;~ConcreteFactoryB() override = default;inline unique_ptr<AbstractProduct> create_concrete_product() const override{return make_unique<ConcreteProductB>();}
};// 客户端
int main()
{// 使用工厂方法创建不同类型的具体产品unique_ptr<AbstractFactory> concrete_factory_a = make_unique<ConcreteFactoryA>();               // 创建具体工厂对象 Aunique_ptr<AbstractProduct> concrete_product_a = concrete_factory_a->create_concrete_product(); // 创建具体产品对象 Aconcrete_product_a->func();unique_ptr<AbstractFactory> concrete_factory_b = make_unique<ConcreteFactoryB>();               // 创建具体工厂对象 Bunique_ptr<AbstractProduct> concrete_product_b = concrete_factory_b->create_concrete_product(); // 创建具体产品对象 Bconcrete_product_b->func();return 0;
}
/*
输出:
ConcreteProductA
ConcreteProductB
*/

抽象工厂模式(Abstract Factory)

结构

  • 抽象产品类 A
  • 具体产品类 A1
  • 具体产品类 B1
  • 抽象产品类 B
  • 具体产品类 B1
  • 具体产品类 B2
  • 抽象工厂类1
  • 具体工厂类1
  • 抽象工厂类2
  • 具体工厂类2
  • 具体工厂对象1 的方法创建具体产品对象 A1 和 具体产品对象 B1
  • 具体工厂对象2 的方法创建具体产品对象 A2 和 具体产品对象 B2

核心

  • 继承
  • 多态
  • 产品和工厂形成二维结构:工厂1创建产品 A1 和 B1,工厂2创建产品 A2 和 B2

代码

#include <iostream>
#include <memory>using std::cout;
using std::endl;
using std::make_unique;
using std::unique_ptr;// 抽象产品类 A
class AbstractProductA
{
public:AbstractProductA() = default;virtual ~AbstractProductA() = default;virtual void func() = 0;
};// 具体产品类 A1
class ConcreteProductA1 : public AbstractProductA
{
public:ConcreteProductA1() = default;~ConcreteProductA1() override = default;void func() override{cout << "ConcreteProductA1" << endl;}
};// 具体产品类 A2
class ConcreteProductA2 : public AbstractProductA
{
public:ConcreteProductA2() = default;~ConcreteProductA2() override = default;void func() override{cout << "ConcreteProductA2" << endl;}
};// 抽象产品类 B
class AbstractProductB
{
public:AbstractProductB() = default;virtual ~AbstractProductB() = default;virtual void func() = 0;
};// 具体产品类 B1
class ConcreteProductB1 : public AbstractProductB
{
public:ConcreteProductB1() = default;~ConcreteProductB1() override = default;void func() override{cout << "ConcreteProductB1" << endl;}
};// 具体产品类 B2
class ConcreteProductB2 : public AbstractProductB
{
public:ConcreteProductB2() = default;~ConcreteProductB2() override = default;void func() override{cout << "ConcreteProductB2" << endl;}
};// 抽象工厂类
class AbstractFactory
{
public:AbstractFactory() = default;virtual ~AbstractFactory() = default;virtual unique_ptr<AbstractProductA> create_product_a() const = 0;virtual unique_ptr<AbstractProductB> create_product_b() const = 0;
};// 具体工厂类 1
class ConcreteFactory1 : public AbstractFactory
{
public:ConcreteFactory1() = default;virtual ~ConcreteFactory1() = default;inline unique_ptr<AbstractProductA> create_product_a() const override{return make_unique<ConcreteProductA1>();}inline unique_ptr<AbstractProductB> create_product_b() const override{return make_unique<ConcreteProductB1>();}
};// 具体工厂类 2
class ConcreteFactory2 : public AbstractFactory
{
public:ConcreteFactory2() = default;virtual ~ConcreteFactory2() = default;inline unique_ptr<AbstractProductA> create_product_a() const override{return make_unique<ConcreteProductA2>();}inline unique_ptr<AbstractProductB> create_product_b() const override{return make_unique<ConcreteProductB2>();}
};// 客户端
int main()
{// 使用抽象工厂创建不同类型的具体产品unique_ptr<AbstractFactory> concrete_factory_1 = make_unique<ConcreteFactory1>();          // 创建具体工厂对象1unique_ptr<AbstractProductA> concrete_product_a1 = concrete_factory_1->create_product_a(); // 创建具体产品对象 A1unique_ptr<AbstractProductB> concrete_product_b1 = concrete_factory_1->create_product_b(); // 创建具体产品对象 B1concrete_product_a1->func();concrete_product_b1->func();unique_ptr<AbstractFactory> concrete_factory_2 = make_unique<ConcreteFactory2>();          // 创建具体工厂2unique_ptr<AbstractProductA> concrete_product_a2 = concrete_factory_2->create_product_a(); // 创建具体产品对象 B1unique_ptr<AbstractProductB> concrete_product_b2 = concrete_factory_2->create_product_b(); // 创建具体产品对象 B1concrete_product_a2->func();concrete_product_b2->func();return 0;
}
/*
输出:
ConcreteProductA1
ConcreteProductB1
ConcreteProductA2
ConcreteProductB2
*/

总结

简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板。


参考资料

  • 【精选】创建型设计模式总结_夜悊的博客-CSDN博客

作者的话

  • 感谢参考资料的作者/博主
  • 作者:夜悊
  • 版权所有,转载请注明出处,谢谢~
  • 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
  • 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
  • 文章在认识上有错误的地方, 敬请批评指正
  • 望读者们都能有所收获

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/152282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如理解WPF绑定中的UpdateSourceTrigger

在WPF中&#xff0c;UpdateSourceTrigger是一个枚举&#xff0c;用于确定绑定源&#xff08;比如视图模型中的属性&#xff09;的更新时机。这对于数据绑定特别重要&#xff0c;因为它控制着用户界面上的更改何时反映到绑定的数据源属性上。下面是UpdateSourceTrigger的几个值&…

Linux:系统基本信息扫描(2)

#网络地址:ip a------------------------------------------------------------- ip a echo "主机名:-------------------------------------------------------" hostnamectl sleep 0.5s echo "#系统基本信息:--------------------------------------------…

YOLO目标检测——无人机航拍输电线路绝缘瓷瓶数据集下载分享【对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;电力系统运维、状态监测与故障诊断、智能电网建设等领域数据集说明&#xff1a;无人机航拍输电线路绝缘瓷瓶数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量…

用欧拉路径判断图同构推出reverse合法性:1116T4

http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…

【心得】基于flask的SSTI个人笔记

目录 计算PIN码 例题1 SSTI的引用链 例题2 SSTI利用条件&#xff1a; 渲染字符串可控&#xff0c;也就说模板的内容可控 我们通过模板 语法 {{ xxx }}相当于变相的执行了服务器上的python代码 利用render_template_string函数参数可控&#xff0c;或者部分可控 render_…

ThreadLocal优化

测试类证明一下ThreadLocal存储的数据是线程程安全的 package com.lin.springboot01;import org.junit.jupiter.api.Test;public class testThreadLocal {Testpublic void testThreadLocalSetAndGet(){//提供一个ThreadLocal对象ThreadLocal t1 new ThreadLocal();new Thread…

【SQL server】数据库、数据表的创建

创建数据库 --如果存在就删除 --所有的数据库都存在sys.databases当中 if exists(select * from sys.databases where name DBTEST)drop database DBTEST--创建数据库 else create database DBTEST on --数据文件 (nameDBTEST,--逻辑名称 字符串用单引号filenameD:\DATA\DBT…

Linux 基本语句_11_无名管道文件复制

父子进程&#xff1a; 父子进程的变量之间存在着读时共享&#xff0c;写时复制原则 无名管道&#xff1a; 无名管道仅能用于有亲缘关系的进程之间通信如父子进程 代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <sys/types.h> #inc…

mysql清除数据痕迹_MySQL使用痕迹清理~/.mysql_history - milantgh

mysql会给出我们最近执行的SQL命令和脚本&#xff1b;同linux command保存在~/.bash_history一样&#xff0c;你用mysql连接MySQL server的所有操作也会被记录到~/.mysql_history文件中&#xff0c;这样就会有很大的安全风险了&#xff0c;如添加MySQL用户的sql也同样会被明文记…

数据结构【DS】图的基本概念

定义 完全图(简单完全图) 完全无向图&#xff1a;边数为&#x1d427;&#x1d427;−&#x1d7cf;&#x1d7d0;完全有向图&#xff1a;边数为 &#x1d427;(&#x1d427;−&#x1d7cf;) 子图、生成子图 G的子图&#xff1a;所有的顶点和边都属于图G的图 G的生成子图…

数据结构与算法编程题4

删除线性表中值在s与t之间的元素&#xff08;s<t&#xff09;&#xff0c;s和t不合理或者顺序表为空则显示出错信息并退出运行。 #include <iostream> using namespace std;typedef int ElemType; #define Maxsize 100 #define OK 1 #define ERROR 0 typedef struct…

SIMULIA 2022 Abaqus新功能之非线性、工作流、子程序、Explicit等

Abaqus 非线性力学的功能增强 Valanis-Landel 超弹性材料 通过指定单轴试验数据和可选的体积试验数据&#xff08;v2022新增选项&#xff09;来定义Valanis-Landel 超弹性模型&#xff0c;该模型能精确地复现给定的数据&#xff0c;类似Marlow模型&#xff0c;但与Marlow模型的…

深信服AC设备用户认证

拓扑图 目录 拓扑图 一. 无需认证 思路&#xff1a;创建用户和组&#xff0c;将无需认证策略和用户绑定 1.创建组&#xff0c;组里添加用户 2. 新建不需要认证策略&#xff0c;将不需要认证策略和用户关联 3.验证 二.密码认证 思路&#xff1a;创建用户和组&#xff0c;并…

在Vue关于ue的computed属性中传递参数

computed的基本用法 computed是Vue实例中一个非常强大的计算属性&#xff0c;它的值主要根据依赖数据而变化。我们可以将一些简单的计算放在computed属性中&#xff0c;从而实现在模板中使用简单的表达式。 但是实际项目中通常有这么一个场景&#xff1a;根据传递不一样的参数值…

Hive效率优化记录

Hive是工作中常用的数据仓库工具&#xff0c;提供存储在HDFS文件系统&#xff0c;将结构化数据映射为一张张表以及提供查询和分析功能。 Hive可以存储大规模数据&#xff0c;但是在运行效率上不如传统数据库&#xff0c;这时需要懂得常见场景下提升存储或查询效率的方法&#x…

赋值 响应式问题

vue2响应式数组重新赋值 如果要重新赋值一个响应式数组&#xff0c;可以使用Vue.set或者 splice 方法。 Vue.set Vue.set 方法可以用来添加新元素或者替换现有元素。语法如下&#xff1a; Vue.set(arr, index, newValue)其中&#xff0c;arr 是要操作的响应式数组&#xff…

shell脚本学习笔记07

如何让shell实现 可选择性执行 的功能 用了while进行循环&#xff0c;是死循环&#xff0c;在循环时&#xff0c;使用case进行使用哪个脚本进行执行。使用clear进行每一次操作前的清屏&#xff0c;eof代表输入这个会显示目录。read用来读取输入的值&#xff0c;如果不输入值不会…

远程数据采集继电器RTU如何应用在智能电动汽车充电桩

远程数据采集继电器&#xff08;Remote Terminal Unit&#xff0c;RTU&#xff09;在智能电动汽车充电桩中的应用&#xff0c;可以为充电桩系统提供更高效、安全和可靠的远程监控与控制功能。下面将详细说明RTU在智能电动汽车充电桩中的应用。 远程监控功能&#xff1a; RTU可以…

【C/C++】全排列及素数环问题

全排列 问题描述&#xff1a;将n个互不相同的数全排列&#xff0c;即1&#xff0c;2&#xff0c;n 方法&#xff1a;dfs 算法思路&#xff1a; dfs(从第一层开始){if(递归结束条件){遍历a[i]}打印换行for(循环n个位数) {if(当前数字没用过){第k层&#xff08;第k个位置&…

Springboot 启动Bean如何被加载

1.启动类 SpringApplication.run(TianMaoApplication.class, args); public ConfigurableApplicationContext run(String... args) {long startTime System.nanoTime();DefaultBootstrapContext bootstrapContext this.createBootstrapContext();ConfigurableApplicationCon…