「C/C++」C++设计模式 之 抽象工厂模式(Abstract Factory)

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

    • C++中抽象工厂模式(Abstract Factory)详解
      • 一、引言
      • 二、定义
      • 三、结构
      • 四、使用示例
      • 五、优点
      • 六、缺点
      • 七、应用场景
      • 八、总结

C++中抽象工厂模式(Abstract Factory)详解

一、引言

在面向对象编程中,设计模式是解决问题的最佳实践。抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来封装一组具有共同主题的单个工厂,而不需要指定它们的具体类。该模式允许客户端使用抽象的接口来创建一系列相关或依赖的对象,而无需关心具体的实现细节。本文将详细介绍C++中的抽象工厂模式,包括其定义、结构、优点、缺点以及应用场景。

二、定义

抽象工厂模式定义了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。该模式主要由四个部分组成:抽象工厂、具体工厂、抽象产品和具体产品。

  1. 抽象工厂(Abstract Factory):声明一个用于创建对象的接口。
  2. 具体工厂(Concrete Factory):实现抽象工厂接口,创建具体产品的实例。
  3. 抽象产品(Abstract Product):声明产品的接口。
  4. 具体产品(Concrete Product):实现抽象产品接口,是具体工厂创建的对象。

三、结构

以下是抽象工厂模式的典型结构:

// 抽象产品:汽车
class Car {
public:virtual void drive() = 0;virtual ~Car() {}
};// 具体产品:SUV
class SUV : public Car {
public:void drive() override {std::cout << "Driving SUV car." << std::endl;}
};// 具体产品:轿车
class Sedan : public Car {
public:void drive() override {std::cout << "Driving sedan car." << std::endl;}
};// 抽象产品:手机
class Phone {
public:virtual void call() = 0;virtual ~Phone() {}
};// 具体产品:安卓手机
class AndroidPhone : public Phone {
public:void call() override {std::cout << "Making a call with Android phone." << std::endl;}
};// 具体产品:苹果手机
class IPhone : public Phone {
public:void call() override {std::cout << "Making a call with iPhone." << std::endl;}
};// 抽象工厂
class AbstractFactory {
public:virtual Car* createCar() = 0;virtual Phone* createPhone() = 0;virtual ~AbstractFactory() {}
};// 具体工厂1:生产SUV和安卓手机
class ConcreteFactory1 : public AbstractFactory {
public:Car* createCar() override {return new SUV();}Phone* createPhone() override {return new AndroidPhone();}
};// 具体工厂2:生产轿车和苹果手机
class ConcreteFactory2 : public AbstractFactory {
public:Car* createCar() override {return new Sedan();}Phone* createPhone() override {return new IPhone();}
};

四、使用示例

以下是如何使用抽象工厂模式的示例代码:

int main() {// 使用具体工厂1创建SUV和安卓手机AbstractFactory* factory1 = new ConcreteFactory1();Car* suv = factory1->createCar();Phone* androidPhone = factory1->createPhone();suv->drive();androidPhone->call();delete suv;delete androidPhone;delete factory1;// 使用具体工厂2创建轿车和苹果手机AbstractFactory* factory2 = new ConcreteFactory2();Car* sedan = factory2->createCar();Phone* iPhone = factory2->createPhone();sedan->drive();iPhone->call();delete sedan;delete iPhone;delete factory2;return 0;
}

五、优点

  1. 分离具体的实现:客户端代码通过接口操作实例,不依赖于具体的类实现。
  2. 易于交换产品系列:因为具体工厂类在一个应用中只需要在初始化的时候出现一次,这使得改变一个应用的具体工厂变得十分容易。
  3. 增加新的产品系列容易:扩展新的产品族比较方便,符合开闭原则(对扩展开放,对修改关闭)。

六、缺点

  1. 难以支持新种类的产品:一旦工厂类中定义好了创建产品的方法后,如果需要添加新产品就不容易,因为抽象工厂接口确定后不容易修改。
  2. 复杂度增加:随着产品族的增加,相关的具体工厂和产品类的数量也会增加,这会使系统更加复杂。

七、应用场景

  1. 系统独立于如何创建、组成和表示它的产品:系统应该对产品类的实现细节和创建过程无需了解。
  2. 系统需要多个产品系列中的一个来配置:可以动态地更改产品系列。
  3. 系统需要提供产品库的类,且只想显示它们的接口而不是实现

八、总结

抽象工厂模式是一种强大的设计模式,它允许我们在不修改客户端代码的情况下,通过更换具体工厂来改变系统的行为。然而,该模式也增加了系统的复杂度和代码量,因此在选择使用时应谨慎考虑。合理地使用抽象工厂模式,可以显著提高代码的可读性、可维护性和可扩展性。


在这里插入图片描述

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

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

相关文章

【pycharm jupyter】启动报错

报错信息 upyter server process exited with code 1 ServerApp] A _jupyter_server_extension_points function was not found in jupyter_lsp. Instead, a _jupyter_server_extension_paths function was found and will be used for now. This function name will be depre…

精密机械代加工服务,为你的企业加速发展!

在当今竞争激烈的工业领域&#xff0c;精密机械代加工服务正成为众多企业实现快速发展的关键助力。这种专业服务凭借其独特的优势&#xff0c;为企业解决了诸多生产难题&#xff0c;推动企业在市场中大步向前。 先进的技术与设备 精密机械代加工服务提供商通常配备了先进的加工…

Data+AI━━揭秘千亿参数背后的技术较量:全球巨头的大模型布局!

DataAI━━揭秘千亿参数背后的技术较量&#xff1a;全球巨头的大模型布局&#xff01; 前言大语言模型:AI技术创新的新高地智能技术创新的"深水区"智能革命的下一站 前言 站在2024年科技创新的潮头&#xff0c;一场由大语言模型引发的技术革命正在上演。从ChatGPT引爆…

jmeter压测工具环境搭建(Linux、Mac)

目录 java环境安装 1、anaconda安装java环境&#xff08;推荐&#xff09; 2、直接在本地环境安装java环境 yum方式安装jdk 二进制方式安装jdk jmeter环境安装 1、jmeter单机安装 启动jmeter 配置环境变量 jmeter配置中文 2、jmeter集群搭建 多台机器部署jmeter集群…

草料二维码:低成本高效率的访客管理解决方案

在当前的商业和政治环境中&#xff0c;企业和政府机构越来越重视安全保密措施&#xff0c;尤其是对外来人员的行踪记录和管理。访客管理已成为企业运营中不可或缺的一环&#xff0c;它不仅提升了安全性&#xff0c;还增强了效率和便捷性。然而&#xff0c;许多机构仍在使用传统…

AOSP刷机

手机电脑都换了 从新复习一下吧 刷机分为几类 线刷 介质&#xff1a;通过USB数据线连接手机与电脑。 方法&#xff1a;通常使用专门的刷机工具&#xff08;如ADB、Fastboot、Odin等&#xff09;将ROM文件直接刷入设备。 优点&#xff1a;一般可以进行更全面的刷机操作&#x…

unocss 添加支持使用本地 svg 预设图标,并支持更改大小

安装 pnpm install iconify/utils 在配置文件 unocss.config.ts&#xff1a; presets > presetIcons 选项中 通过 FileSystemIconLoader 加载本地图标&#xff0c;并指定目录。 import presetWeapp from unocss-preset-weapp import { extractorAttributify, transformer…

一篇文章理解CSS垂直布局方法

方法1&#xff1a;align-content: center 在 2024 年的 CSS 原生属性中允许使用 1 个 CSS 属性 align-content: center进行垂直居中。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewpo…

基于STM32+华为云IOT设计的大棚育苗管理系统

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】NBIOT-BC26模块【2】MQ135传感器【4】SHT30传感器【5】B1750传感器 二…

小家电常用防水触摸IC

小家电常用防水触摸IC 挑战100个ICMAN“芯”实验-小家电常用防水触摸IC 电容式触摸芯片通常用于实现触摸控制&#xff0c;可轻松解决家用电器常见的触摸感应不灵敏和有水误触发的问题&#xff0c;优化了用户的交互使用体验&#xff0c;从而有效实现控制面板触摸按键的触摸感应和…

C++和OpenGL实现3D游戏编程【连载17】——着色器进阶

欢迎来到zhooyu的专栏。 主页网址&#xff1a;【zhooyu】 专栏网址&#xff1a;【C和OpenGL实现3D游戏编程】 &#x1f31f;&#x1f31f;&#x1f31f;这里将通过一个OpenGL实现3D游戏编程实例教程&#xff0c;带大家深入学习OpenGL知识。知识无穷而人力有穷&#xff0c;希望…

2342423

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

《Python游戏编程入门》注-第4章8

2.2 “黄色炸弹”的实现 “黄色炸弹”实际上是不断重复地从屏幕顶端落下的黄色圆圈。 2.2.1 设置炸弹位置及下落速度 从图1中可以看出,“黄色炸弹”落下的位置(水平方向)是随机的,图8所示代码用来设置炸弹位置及下落速度。 图8 设置炸弹位置及下落速度的代码 其中,bom…

如何打开/关闭 GitLab 的版本检查功能?

本文分享如何打开/关闭 GitLab 的版本检查功能。 极狐GitLab 是 GitLab 的中国发行版【https://dl.gitlab.cn/ncecn6kb】&#xff0c;中文版本对中国用户更友好&#xff0c;文章以私有化部署的极狐GitLab 实例来演示版本检查功能的开启和关闭。强烈不建议关闭该功能&#xff0…

Linux——Ubuntu环境C编程

配置vim编辑器 设置一个tab键为4个空格 打开/etc/vim/vimrc文件&#xff0c;此文件为只读&#xff0c;所以要用sudo访问boot权限&#xff1a; set ts4&#xff08;设置一个tab键为4空格&#xff09; set nu&#xff08;vim编辑器下显示行号&#xff09; gcc编译器 gcc命令…

java访问华为网管软件iMaster NCE的北向接口

最近做的一个项目&#xff0c;需要读取华为一个叫iMaster NCE的网管软件的北向接口。这个iMaster NCE&#xff08;以下简称NCE&#xff09;用于管理项目的整个网络&#xff0c;尤其是光网络。业主要求我们访问该软件提供的对外接口&#xff0c;读取一些网络信息&#xff0c;比如…

ABeam 德硕 | 共探AI时代人才新生态,ABeam旗下德硕管理咨询(上海)有限公司荣膺2024杰出雇主!

ABeam News 近日&#xff0c;由HRoot主办的“2024中国人力资本发展大会”在上海市徐汇西岸艺术中心A馆盛大开幕并成功举办。大会以“智能协同 人才与AI的共生”为主题&#xff0c;作为咨询公司的ABeam中国&#xff0c;以优秀的人才管理理念及成果&#xff0c;受邀参会并荣获20…

App Store 截图生成器:轻松制作专业级应用营销图片

在线使用 &#x1f449; 立即使用截图生成器 简介 App Store 截图生成器是一个专门为 iOS 开发者和营销人员设计的在线工具&#xff0c;可以快速生成符合 App Store 规范的应用预览图片。无论是 iPhone 还是 iPad 应用&#xff0c;都能轻松创建出精美的营销截图。 主要特点…

数据结构之顺序表(C语言)

1 线性表 线性表是n个具有相同特性的数据元素的有限序列&#xff0c;是一种在实际中广泛应用的数据结构&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列、字符串等。 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。但是在物理结构上并不一定是…

#【YashanDB认证】#YCA的学习过程总结-之崖山数据库初体验

概述 前段时间崖山数据库做推广活动&#xff0c;参加了yca的考试&#xff0c;为啥参加这个数据库厂商的学习呢&#xff0c;因为目前这个数据库最像Oracle&#xff0c;又听公司的前辈说呢&#xff0c;这个公司的前身是华为人出来做的数据库&#xff0c;华为人的精神呢&#xff0…