【C/C++】设计模式——工厂模式:简单工厂、工厂方法、抽象工厂

devtools/2024/10/18 5:44:06/

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

c语言】全部知识点总结


目录

  • 一、工厂模式的特点
  • 二、简单工厂模式(静态工厂)
  • 三、工厂方法
  • 四、抽象工厂

一、工厂模式的特点

工厂模式提供了一种封装对象创建过程的方式,使得代码更易于管理和扩展。

工厂模式隐藏了对象的具体创建过程,从而可以通过接口来创建对象,而无需关心具体的实现细节

扩展性高:工厂模式利于后期方法的维护,解耦合。

二、简单工厂模式(静态工厂)

将对象的创建和使用分离,由一个工厂类根据传入的参数来决定创建哪一种产品类的实例

image.png

#include <iostream>
using namespace std;class Product 
{//抽象类
public:virtual void use() = 0; // 纯虚函数,定义产品接口  
};class ProductA : public Product {
public:void use() override {cout << "ProductA::use()" << endl;}
};class ProductB : public Product {
public:void use() override {cout << "ProductB::use()" << endl;}
};class SimpleFactory 
{//简单工厂
public:static Product* createProduct(const string& type) {//根据传入的参数来决定创建哪一种产品类的实例if (type == "A") {cout << "create ProductA" << endl;return new ProductA();}else if (type == "B") {cout << "create ProductB" << endl;return new ProductB();}return nullptr;}
};int main()
{//根据产品类型创建产品Product* product = SimpleFactory::createProduct("B");//使用对应类型的产品if (product){product->use();delete product; }return 0;
};

image.png

三、工厂方法

简单工厂违背了开闭原则,故将简单工厂中的工厂拆分为多个工厂:

增加产品时 Factory 工厂不用改变,只需要添加对应产品类型的工厂

image.png

#include <iostream>
using namespace std;class Product {
public:virtual void use() = 0;
};class ProductA : public Product {
public:void use() override { cout << "ProductA::use()" << endl; }
};class ProductB : public Product {
public:void use() override { cout << "ProductB::use()" << endl; }
};//工厂方法
class Creator 
{//抽象类 工厂方法
public:virtual Product* createProduct() = 0; 
};class CreatorA : public Creator 
{//ProductA工厂
public:Product* createProduct() override {cout << "CreatorA createProduct ProductA" << endl;return new ProductA();}
};class CreatorB : public Creator 
{//ProductB工厂
public:Product* createProduct() override {cout << "CreatorB createProduct ProductB" << endl;return new ProductB();}
};int main()
{//创建工厂:生产A产品类型的工厂Creator* creator = new CreatorA();//使用该工厂创建产品Product* product = creator->createProduct();//使用产品product->use();delete product; // 释放产品  delete creator; // 释放工厂return 0;
};

image.png

四、抽象工厂

抽象工厂与工厂方法类似,工厂不止用来生产一种产品,可以用于创建与产品相关的一系列产品

适用于大批量、一系列的对象的生产。


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

http://www.ppmy.cn/devtools/42043.html

相关文章

Remix 集成 MUI

Remix 如何接入 MUI 组件库&#xff0c;MUI 官网提供了一个 Remix 接入 MUI 的例子&#xff0c;用的是老的 Remix版本&#xff0c;如何接入新的 Vite 版本呢&#xff1f; 由于 MUI 支持 SSR&#xff0c;只需要改造对应的 Client 和 Server 即可实现。安装 MUI 组件组件库&…

物联网促进信息化——​青创智通工业物联网解决方案​

随着传感器网络&#xff08;WSN)、无线射频识别&#xff08;RFID&#xff09;以及微电子机械系统(MEIVIS&#xff09;等技术的不断成熟,扩展了人们对信息获取和使用的能力&#xff0c;并将提高制造效率、改善产品质量、降低产品成本和资源消耗、为用户提供更加透明和个性化的服…

Golang 的 unmarshal 踩坑指南

文章目录 1. 写在最前面2. 字段区分出空字段还是未设置字段2.1 问题描述2.2 解决 3. 字段支持多种类型 & 按需做不同类型处理3.1 问题描述3.2 解决 4. 碎碎念5. 参考资料 1. 写在最前面 笔者最近在实现将内部通知系统的数据定义转化为产品定义的对外提供的数据结构。 举例…

2D Chests Assets - Mega Pack

科幻/奇幻/经典主题的箱子和容器。AAA质量,高分辨率,VFX,源PSD文件。 这是一个带有手绘套装的大包装: -【梦幻之栗】 -【科幻钱包】 AAA质量。高分辨率。一切都已准备就绪,可供使用。包括PSD文件。 在1.1版本中添加了VFX并将项目更新为URP。请注意,新的VFX仅适用于URP/HD…

【考研数学】进入强化,基础过关《660》不会做怎么办?

做题没思路&#xff0c;说明学习的过程中走了弯路 很多人&#xff0c;按部就班的学习&#xff0c;觉得课我也听了&#xff0c;讲义也看了&#xff0c;怎么别人做题很顺&#xff0c;自己翻开书就一头雾水。搞清楚其中的差别&#xff0c;也就解决了做题没思路的问题。 首先我们…

RustGUI学习(iced/iced_aw)之小部件(十九):如何使用context_menu部件来创建右击菜单?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第十九篇,主要讲述context_menu右击菜单部件的使…

Rancher-Kubewarden-保姆级教学-含Demo测试

一、什么是Kubewarden&#xff1f; What is Kubewarden? | Kubewarden 1、就是容器集群的准入策略引擎。 1、使用的策略其实就是k8s原生的security context. 2、使用WebAssembly来编写策略。 1、WebAssembly&#xff0c;可以使用擅长的开发语言来编写策略。&#xff08;下面的…

webpack优化构建速度示例-合理配置loader的include exclude:

实际上&#xff0c;babel-loader 在 Webpack 配置中默认并不包含 exclude 和 include 选项的默认值&#xff0c;通常&#xff0c;为了优化构建性能&#xff0c;开发者会显式地设置 exclude 和 include 选项&#xff0c;以便 babel-loader 只处理必要的文件。 src/index.js impo…