2023-6-11-第二式抽象工厂模式

news2024/12/26 3:40:09


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、抽象工厂模式实现
  • 🎉三、注意事项
  • 🐱‍🚀四、抽象工厂模式什么时候用
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。

在抽象工厂模式中,客户端通过调用抽象工厂接口中的方法来创建一系列相关的产品对象。这些产品对象都是由具体的工厂类来创建的,每个具体工厂类都负责创建一组特定的产品。

抽象工厂模式的优点是可以保证客户端始终只使用同一组产品,而不会出现不兼容的情况。此外,通过使用抽象工厂模式,可以使客户端与具体产品的实现相分离,从而使系统更加灵活,易于扩展和维护。

在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。


🐱‍🐉二、抽象工厂模式实现

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
首先,定义抽象产品类 AbstractProduct,它包含了产品的公共方法:

class AbstractProduct {
public:
    virtual void operation() = 0;
    virtual ~AbstractProduct() {}
};

然后,定义具体产品类 ConcreteProductAConcreteProductB,它们实现了抽象产品接口,具体实现了产品的方法:

class ConcreteProductA : public AbstractProduct {
public:
    void operation() override {
        std::cout << "ConcreteProductA operation" << std::endl;
    }
};

class ConcreteProductB : public AbstractProduct {
public:
    void operation() override {
        std::cout << "ConcreteProductB operation" << std::endl;
    }
};

接下来,定义抽象工厂接口 AbstractFactory,它包含了创建一系列产品的方法:

class AbstractFactory {
public:
    virtual AbstractProduct* createProductA() = 0;
    virtual AbstractProduct* createProductB() = 0;
    virtual ~AbstractFactory() {}
};

然后,定义具体工厂类 ConcreteFactory,它实现了抽象工厂接口,负责创建一组特定的产品:

class ConcreteFactory : public AbstractFactory {
public:
    AbstractProduct* createProductA() override {
        return new ConcreteProductA();
    }

    AbstractProduct* createProductB() override {
        return new ConcreteProductB();
    }
};

最后,客户端使用抽象工厂来创建一组产品:

int main() {
    AbstractFactory* factory = new ConcreteFactory();
    AbstractProduct* productA = factory->createProductA();
    AbstractProduct* productB = factory->createProductB();
    productA->operation();
    productB->operation();
    delete productA;
    delete productB;
    delete factory;
    return 0;
}

输出结果为:

ConcreteProductA operation
ConcreteProductB operation

🎉三、注意事项

使用抽象工厂模式需要注意以下几点:

  1. 接口设计要合理:抽象工厂模式依赖接口而不是实现,因此在设计时需要考虑到具体产品的可能性和变化,保证接口足够灵活。

  2. 工厂类实现适度复杂:抽象工厂模式需要一个或多个工厂类来生产不同类型的产品,这些工厂类的实现会比较复杂且耦合度较高,需要根据具体情况进行权衡,尽量避免过于复杂的实现。

  3. 产品族扩展困难:抽象工厂模式的主要目的是支持多种产品族的扩展,但如果需要增加新的产品族,则需要修改工厂接口和所有的工厂实现,这一过程比较麻烦。

  4. 客户端代码可读性较差:由于抽象工厂模式提供了多个接口和多个产品等级结构,因此客户端代码相对会比较复杂,可读性不如简单工厂模式和工厂方法模式那么好。


🐱‍🚀四、抽象工厂模式什么时候用

  1. 当需要创建一组相关或相互依赖的对象时,可以使用抽象工厂模式。例如,创建一个具有不同操作系统的应用程序,每个操作系统都有自己的一组 UI 控件,可以使用抽象工厂模式来创建这些控件。

  2. 当希望客户端与具体产品的实现相分离时,可以使用抽象工厂模式。客户端只需要知道抽象工厂接口和抽象产品接口,而不需要知道具体工厂类和具体产品类的实现细节。

  3. 当希望系统更加灵活、易于扩展和维护时,可以使用抽象工厂模式。通过使用抽象工厂模式,可以轻松添加新的产品系列,而不会影响现有的代码。

需要注意的是,抽象工厂模式适用于创建一系列相关或相互依赖的产品,如果只需要创建单个产品,或者产品之间没有关系,则不适合使用抽象工厂模式。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

  本文讲了关于抽象工厂模式的概念






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

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

相关文章

【macbookpro】重装ventura系统

intel 的cpu 的macbook pro 13寸定制版本。 大神们遇到的问题很专业 格式化 mac数据恢复 更新软件 通过“macOS 恢复”重新安装 macOS 大神们说固件是因为时间不对&#xff0c;从美国服务器下载的 打开日志,我看了下我的时间也不对 好像至少要下载2个文件&#xff0c;一…

MATLAB涡度通量数据处理实践技术应用

基于MATLAB语言、以实践案例为主&#xff0c;提供代码、原理与操作结合 1、以涡度通量塔的高频观测数据为例&#xff1a;基于MATLAB开展上机操作 2、涡度通量观测基本概况&#xff1a;观测技术方法、数据获取与预处理等 3、涡度通量数据质量控制&#xff1a;通量数据异常值识…

EPICS boRecord驱动程序编写和使用示例

以下示例程序将展示如何使用gpio的动态链接库编写一个boRecord的驱动程序&#xff0c;并且展示如何使用这个程序&#xff0c;控制一个LED灯的亮灭。 1&#xff09; 新建这个示例程序的顶层目录&#xff0c;并且用makeBaseApp.pl在新建目录中构建这个IOC程序程序框架&#xff1…

前端项目安全扫描出来的漏洞——解决过程

为什么要升级&#xff0c;如图云桌面&#xff08;相当于堡垒机-远程桌面&#xff09;的项目审查是大概基于node16版本进行扫描的&#xff0c;本来我方是通过降版本从14到12绕过大范围更新&#xff0c;但现在躲得过初一躲不过十五&#xff0c;如何更新 package-lock.json 中的一…

HummerRisk获中国开源创新大赛优秀奖

日前&#xff0c;2022中国开源创新大赛落下帷幕&#xff0c;最终HummerRisk 荣获优秀奖。 5月31日&#xff0c;2022中国互联网发展创新与投资大赛暨2022年中国开源创新大赛在京落下帷幕。大赛由中央网信办信息化发展局指导&#xff0c;中国互联网发展基金会、中国网络空间研究院…

聚观早报 |特斯拉11天涨2000亿美元;三星正开发自有大型语言模型

今日要闻&#xff1a;特斯拉11天涨2000亿美元&#xff1b;三星正开发自有大型语言模型&#xff1b;苹果史上最贵新品遇冷&#xff1b;抖音外卖终止1000亿元GMV目标&#xff1b;12306试行在线选铺服务 特斯拉11天涨2000亿美元 特斯拉在 11 天的时间里市值增加了超过 2000 亿美元…

windows 服务程序和桌面程序集成(三)UDP监控工具

系列文章目录链接&#xff1a; windows 服务程序和桌面程序集成&#xff08;一&#xff09;概念介绍windows 服务程序和桌面程序集成&#xff08;二&#xff09;服务程序windows 服务程序和桌面程序集成&#xff08;三&#xff09;UDP监控工具windows 服务程序和桌面程序集成&…

基本线性分组码与性能参数及差错控制

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 基本线性分组码与性…

DAY 73 rsync远程同步

rsync介绍 rsync简介 rsync&#xff08;Remote Sync&#xff0c;远程同步&#xff09;是一个开源的快速备份工具&#xff0c;可以在不同主机之间镜像同步整个目录树&#xff0c;支持增量备份&#xff0c;并保持链接和权限&#xff0c;且采用优化的同步算法&#xff0c;传输前…

回调函数排序异常原因

回调函数排序异常原因 问题所在解决方案 参考我的这篇博文c回调函数排序:回调函数 我之前的代码是这样写的:&#xff08;存在问题&#xff09; 问题所在 将数组传递到其他函数中&#xff0c;再使用sizeof(数组名)&#xff0c;得到的不是数组的完成长度了(往往会短一些) 解决…

美团、抖音“卷”向本地生活B端

配图来自Canva可画 当美团与大众点评的合并案落下帷幕&#xff0c;美团在本地生活领域的江湖地位就算是基本奠定了。只不过&#xff0c;随着互联网技术的不断发展和创新&#xff0c;本地生活服务又被提供了更多的可能性和新机遇。因此&#xff0c;尽管美团严防死守&#xff0c…

花青素-肠道微生物群-健康轴

谷禾健康 花青素-肠道微生物群-健康轴 经常听到一些专家在介绍食品或保健品时说富含花青素&#xff0c;那么究竟什么是花青素&#xff1f;对我们的健康又有何益处&#xff1f; 花青素是在植物组织中发现的天然水溶性色素&#xff0c;水果、蔬菜、花卉中的呈色物质大部分与之有关…

vue项目中使用html2canvas解决截图不全的问题

话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; <div><el-button click"downloadPicture">下载</el-button><div ref"imageDom"><el-table:data"tableData"style"width: 100%":row…

喜讯 | 华秋电子荣获证券时报年度高成长企业

6月9日&#xff0c;由证券时报社主办的第十一届中国创业投资论坛盛大开启&#xff0c;在论坛上&#xff0c;2023证券时报创投金鹰奖暨创业企业新苗奖评选隆重揭晓。 经过两个多月紧张的申报、投票、评选&#xff0c;近300家机构和企业的激烈比拼&#xff0c;最终一批独具韧劲、…

【React】React中编写CSS,Redux,RTX

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 React中编写CSS内联样式普通csscss modulescss in js动态添加class ReduxJS纯函数如何创建redux…

中国联通泛终端技术生态创新成果发布,移远通信荣获业务与应用板块突出贡献奖

6月7日&#xff0c;以“轻联万物 共赴星海”为主题的2023中国联通泛终端技术生态创新成果发布会在北京举行。 会上&#xff0c;中国联通泛终端技术生态创新联合实验室对一年来作出突出贡献的单位进行了嘉奖。移远通信凭借其在物联网产品及应用解决方案等领域的深厚积累和突出贡…

KubeSphere 社区双周报 | OpenFunction 发布 v1.1.0 | 2023.5.26-6.8

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.05.26-2023.…

将本地项目推到gitee上

查看原来仓库地址 git remote -v删除原来仓库地址 git remote rm origin # git remote rm origin https://gitee.com/zhangxiaoQ/large-file-upload.git添加需要推送的仓库 git remote add origin https://gitee.com/stevencmu/large-file-upload.git

Unity Scene界面出好多黄线解决办法

点下 Button下的Visualize就消失

创建可引导的 macOS 安装器(可启动U盘)

Apple官网下载的macOS镜像&#xff0c;只是一个安装包&#xff0c;不带引导不能直接安装到空白mac机器的。 1、首先&#xff0c;你必须要有台能正常运行macOS的mac pc。 2、下载macOS Sierra 10.12 El Capitan 10.11 Yosemite 10.10 Mountain Lion 10.8 Lion 10.7 点按以…