C++设计模式(工厂方法模式)

news2025/5/12 8:18:20

文章目录

  • 前言
  • 一、工厂方法模式介绍
  • 二、工厂方法模式和简单工厂模式对比
  • 三、工厂方法模式适用场景
  • 四、工厂方法模式示例代码
  • 总结


前言

本篇文章来带大家学习C++中的工厂方法模式。

一、工厂方法模式介绍

工厂方法模式是一种创建型设计模式,用于通过工厂方法创建对象而不需要明确指定其具体类。该模式通过定义一个创建对象的接口,但将具体的对象创建延迟到其子类中。这样可以将对象的创建与使用分离,提高代码的灵活性和可扩展性。

UML结构图:

在这里插入图片描述

二、工厂方法模式和简单工厂模式对比

1.实现方式:

简单工厂模式:由一个工厂类负责创建对象,根据传入的参数或条件来决定创建哪种具体对象。相当于一个工厂类集中了所有产品的创建逻辑。
工厂方法模式:将对象的创建延迟到子类中,每个具体产品都有对应的工厂类,负责创建该产品。每个工厂类只负责创建一种具体的产品。

2.灵活性和扩展性:

简单工厂模式:通过一个工厂类集中管理对象的创建,增加新的产品时需要修改工厂类的代码,不符合开闭原则(对扩展开放,对修改关闭)。
工厂方法模式:每个具体产品都有对应的工厂类,新增产品时只需要添加新的具体产品和对应的工厂类,不需要修改现有代码。符合开闭原则。

3.耦合度:

简单工厂模式:客户端代码需要依赖工厂类,通过工厂类创建具体产品的实例。
工厂方法模式:客户端代码依赖抽象工厂和抽象产品类,通过抽象工厂创建具体产品的实例。客户端代码与具体工厂类和具体产品类解耦。

4.类的数量:

简单工厂模式:只需要一个工厂类负责创建所有产品,工厂类可能会变得很大。
工厂方法模式:每个具体产品都有对应的工厂类,类的数量比简单工厂模式多,但可以更细粒度地管理对象的创建。

三、工厂方法模式适用场景

1.对象的创建需要遵循特定的接口或抽象类:工厂方法模式适用于创建一组相关对象,这些对象共享一个公共的接口或抽象类。通过定义抽象工厂和具体工厂类,可以确保创建的对象都符合同一接口或抽象类的定义。

2.需要通过子类来决定创建的具体对象:工厂方法模式将对象的创建延迟到子类中,子类可以根据具体需求来选择实现哪种具体对象。这样可以在不修改客户端代码的情况下,动态地增加或切换具体对象的类型。

3.需要通过扩展来添加新的产品:如果系统中需要添加新的产品,工厂方法模式可以提供一种扩展机制,使得添加新产品变得更加容易。只需创建新的具体产品类和对应的具体工厂类,而不需要修改已有的代码。

4.需要对客户端代码与具体产品的耦合进行解耦:通过引入抽象工厂和具体工厂类,工厂方法模式可以将客户端代码与具体产品的创建过程解耦。客户端只需要依赖于抽象工厂和抽象产品类,而不需要自己直接创建具体对象,从而降低了耦合度。

四、工厂方法模式示例代码

#include <iostream>
#include <string>

// 抽象产品类
class Product {
public:
    virtual void use() const = 0;
};

// 具体产品类 A
class ConcreteProductA : public Product {
public:
    void use() const override {
        std::cout << "Using ConcreteProductA" << std::endl;
    }
};

// 具体产品类 B
class ConcreteProductB : public Product {
public:
    void use() const override {
        std::cout << "Using ConcreteProductB" << std::endl;
    }
};

// 抽象工厂类
class Factory {
public:
    virtual Product* createProduct() const = 0;
};

// 具体工厂类 A
class ConcreteFactoryA : public Factory {
public:
    Product* createProduct() const override {
        return new ConcreteProductA();
    }
};

// 具体工厂类 B
class ConcreteFactoryB : public Factory {
public:
    Product* createProduct() const override {
        return new ConcreteProductB();
    }
};

int main() {
    // 使用具体工厂类 A 创建产品对象
    Factory* factoryA = new ConcreteFactoryA();
    Product* productA = factoryA->createProduct();
    productA->use();

    delete productA;
    delete factoryA;

    // 使用具体工厂类 B 创建产品对象
    Factory* factoryB = new ConcreteFactoryB();
    Product* productB = factoryB->createProduct();
    productB->use();

    delete productB;
    delete factoryB;

    return 0;
}

总结

本篇文章就讲解到这里。

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

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

相关文章

jdk新特性 02 .接口增强和函数式接口,方法引用

1.JDK8中接口的新增 在JDK8中针对接口有做增强&#xff0c;在JDK8之前 interface 接口名{ 静态常量; 抽象方法; }JDK8之后对接口做了增加&#xff0c;接口中可以有默认方法和静态方法 interface 接口名{ 静态常量; 抽象方法; 默认方法; 静态方法; }2.默认方法 2.1 为什么要增…

OS 内核级线程

用户级线程是两个栈&#xff0c;核心级线程是两套栈&#xff0c;用户栈和内核栈 用户级是并发&#xff08;同时触发、交替执行&#xff09;&#xff0c;这个是并行&#xff08;同时触发可以同时执行&#xff09; 进入内核的唯一方式是中断 根据TCB的切换&#xff0c;实现内核…

【经验贴】新手项目经理如何接手并管好项目?

最近有刷到这样一些求助帖&#xff1a;初入职场两三年的项目经理现在开始独立带项目&#xff0c;由于缺乏经验不知道从何下手&#xff0c;询问如何能快速接手并管好项目呢&#xff1f;这个话题也引起了大家的热议&#xff0c;今天就给大家分享一下一些实践经验。 1.刚拿到项目时…

如何做好项目进度管理?来看这几个要点!

8个项目管理工具模板、60个项目管理甘特图标模板、赠送30本项目管理电子书https://download.csdn.net/download/XMWS_IT/19886618?spm1001.2014.3001.5503 项目进度管理是指在项目实施过程中&#xff0c;对各阶段的进展程度和项目最终完成的期限所进行的管理。其目的是保证项目…

clickhouse-压测

一、数据集准备 数据集可以使用官网数据集&#xff0c;也可以用ssb-dbgen来准备 1.准备数据 这里最后生成表的数据行数为60亿行&#xff0c;数据量为300G左右 git clone https://github.com/vadimtk/ssb-dbgen.git cd ssb-dbgen/ make1.1 生成数据 # -s 指生成多少G的数据…

Linux C 多进程编程(面试考点)

嵌入式开发为什么要移植操作系统&#xff1f; 1.减小软硬件的耦合度&#xff0c;提高软件的移植性 2. 操作系统提供很多库和工具&#xff08;QT Open CV&#xff09;&#xff0c;提高开发效率 3.操作系统提供多任务机制&#xff0c;______________________? (提高C…

Zenity 简介

什么使 Zenity Zenity 是一个开源的命令行工具&#xff0c;它提供了一种简单的方式来创建图形化的用户界面&#xff08;GUI&#xff09;对话框&#xff0c;以与用户进行交互。它基于 GTK 库&#xff0c;可以在 Linux 和其他 UNIX-like 系统上使用。 Zenity 可以通过命令行或脚…

最新政策丨政务服务电子文件归档和电子档案管理办法说了什么?

随着数字化时代的持续演进&#xff0c;我国政府部门正积极推动数字政府建设&#xff0c;以优化政务服务&#xff0c;提升办事效率。为了适应这一背景&#xff0c;国务院发布了《政务服务电子文件归档和电子档案管理办法》&#xff0c;旨在规范电子档案管理&#xff0c;加强政务…

为什么使用消息队列?消息队列能够做什么?消息队列有哪些?怎么选择?

❤ 作者主页&#xff1a;李奕赫揍小邰的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是李奕赫&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习!!!&#x1f389;&#x1f389; 文章目录 为什么使用消…

msvcp110.dll下载安装方法分享,教你怎么快速的修复msvcp110.dll文件

当你的电脑出现msvcp110.dll文件缺失时&#xff0c;这时候不要慌张&#xff0c;其实要解决这个问题很简单&#xff0c;我们只要重新下载安装msvcp110.dll文件就可以了&#xff0c;今天主要是来给大家讲解一下这方面的信息&#xff0c;教大家如何下载安装msvcp110.dll。 一.了解…

MPDIoU:有效和准确的边界框回归的损失

文章目录 摘要1、简介2、相关工作2.1、目标检测和实例分割2.2. 场景文本识别2.3、边界框回归的损失函数 3、点距最小的并集交点4、实验结果4.1、 实验设置4.2、数据集4.3、 评估协议4.4、 目标检测的实验结果4.5、 字符级场景文本识别的实验结果4.6、 实例分割的实验结果 5、 结…

Anomalib:异常检测的深度学习库 -- 应用Anomalib训练自己的图片

文章目录 资料汇总 Github链接&#xff1a;https://github.com/openvinotoolkit/anomalib/blob/main/README.md 论文链接&#xff1a;https://arxiv.org/pdf/2202.08341v1.pdf 其他参考资料&#xff1a;https://paperswithcode.com/paper/efficientad-accurate-visual-anomaly-…

突破限制,创造佳绩!国内工作流厂商助您腾飞!

随着业务量的激增&#xff0c;很多企业单位都想在办公领域更上一层楼&#xff0c;实现飞跃式地腾飞。采用什么样的软件设备能助力企业降本增质&#xff1f;国内工作流厂商流辰信息作为研发低代码技术平台的服务商&#xff0c;一直深知行业形式和发展动态&#xff0c;将全力以赴…

前端开发工具: VSCode

VSCode 安装使用教程&#xff08;图文版&#xff09; | arry老师的博客-艾编程 1. 下载 在官方网站&#xff1a;https://code.visualstudio.com/ 下载最新版本的 VSCode 即可 2. VSCode 常见插件安装 所有插件安装后,需要重启一下才生效 2.1 简体中文语言包 2.2 编辑器主…

四信重磅推出5G RedCap AIoT摄像机 RedCap轻量级5G终端新品首发!

6月6日&#xff0c;四信受邀出席移动物联网高质量发展论坛&#xff0c;并在移动物联网新产品发布环节隆重推出5G RedCap AIoT摄像机&#xff0c;再次抓紧需求先机&#xff0c;为行业用户创造无限可能&#xff01; 两大应用场景 助推RedCap走深向实 火遍全网络的RedCap应用场景可…

Git gui教程---第七篇 Git gui的使用 返回上一次提交

1&#xff0e; 查看历史&#xff0c;打开gitk程序 2&#xff0e; 选中需要返回的版本&#xff0c;右键&#xff0c;然后点击Rest master branch to here 3.出现弹窗 每个选项我们都试一下&#xff0c;从Hard开始 返回的选项 HardMixedSoft Hard 会丢失所有的修改【此处的…

List 去重两种方式:stream(需要JDK1.8及以上)、HashSet

1、使用Stream 方法 使用JDK1.8及以上 /*** Java合并两个List并去掉重复项的几种做法* param args*/public static void main(String[] args) {String[] str1 {"1", "2", "3", "4", "5", "6"};List<String&…

Protobuf 原理大揭秘

一、定义 Google推出的一种 结构化数据 的数据存储格式&#xff08;类似于 XML、Json &#xff09;。 多个版本的源码地址 https://github.com/protocolbuffers/protobuf/ 1、为什么选择它 优点&#xff1a; 效率高&#xff1a;Protobuf 以二进制格式存储数据&#xff0c;比…

汇编语言调试工具:DosBox及debug安装配置使用教程

前言 学习汇编语言时&#xff0c;需要进入dos模式并使用debug工具调试。但是64位win10系统没有自带这些工具。因此&#xff0c;需要额外安装DosBox和debug.exe两个软件。本文介绍如何下载、安装、配置这两个工具软件。 1、DosBox下载 简介 DOSBox 是一个 DOS 模拟程序&#xf…

SMOKE多模式排放清单处理技术及EDGAR/MEIC清单制作与VOCs排放量核算

1、掌握大气污染源排放清单不确定性来源及定量分析方法&#xff1b; 2、以VOCs排放为例&#xff0c;掌握排放源核算及组分清单建立方法; 3、掌握基于SMOKE模型的大气污染源排放清单处理技术方法&#xff1b; 4、掌握基于SMOKE的多模式排放清单输入制备方法&#xff1b;5、通过…