设计模式2、抽象工厂模式 Abstract Factory

news2024/11/25 18:52:34
解释说明:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
简言之,一个工厂可以提供创建多种相关产品的接口,而无需像工厂方法一样,为每一个产品都提供一个具体工厂
抽象工厂(AbstractFactory):提供了创建抽象的接口,它包含了多个创建产品的方法,可以创建多个不同等级的产品
具体工厂(ConcreteFactory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建
抽象产品(Product):定义产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是一对一的关系
优点
    封装了产品的创建,使得不需要知道具体是哪种产品,只需要知道是哪个工厂即可。
    可以支持不同类型的产品,使得模式灵活性更强。
    可以非常方便的使用一族中的不同类型的产品。
缺点:
    结构过于臃肿,如果产品类型较多或产品族较多,会非常难于管理。
    每次如果添加一组产品,那么所有的工厂类都必须添加一个方法,这样违背了开放-封闭原则。所以一般适用于产品组合产品族变化不大的情况。
适用场景
    在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
考虑这样一个场景,如下图
    Jungle想要进行户外运动,它可以选择打篮球和踢足球。但这次Jungle不想弄脏原本穿的T恤,所以Jungle还需要穿球衣,打篮球就穿篮球衣,踢足球就穿足球衣。篮球保管室可以提供篮球和篮球衣,足球保管室可以提供足球和足球衣。Jungle只要根据心情去某个保管室,就可以换上球衣、拿上球,然后就可以愉快地玩耍了
对应的UML实例图如下图
#pragma once
#include <string>
using namespace std;
// 汽车接口
class ICar
{
public:
       virtual string Name() = 0;  // 汽车名称
};
/********** 汽车 **********/
// 奔驰
class BenzCar : public ICar
{
public:
    string Name() {
        return "Benz Car";
    }
};
// 宝马
class BmwCar : public ICar
{
public:
    string Name() {
        return "Bmw Car";
    }
};
// 奥迪
class AudiCar : public ICar
{
public:
    std::string Name() {
        return "Audi Car";
    }
};
// 自行车接口
class IBike
{
public:
       virtual string Name() = 0;  // 自行车名称
};
/********** 自行车 **********/
// 奔驰
class BenzBike : public IBike
{
public:
    string Name() {
        return "Benz Bike";
    }
};
// 宝马
class BmwBike : public IBike
{
public:
    string Name() {
        return "Bmw Bike";
    }
};
// 奥迪
class AudiBike : public IBike
{
public:
    string Name() {
        return "Audi Bike";
    }
};

#include "product.h"
// 抽象工厂
class AFactory
{
public:
       enum FACTORY_TYPE {
              BENZ_FACTORY,  // 奔驰工厂
              BMW_FACTORY,  // 宝马工厂
              AUDI_FACTORY  // 奥迪工厂
       };
       virtual ICar* CreateCar() = 0;  // 生产汽车
       virtual IBike* CreateBike() = 0;    // 生产自行车
       static AFactory* CreateFactory(FACTORY_TYPE factory);  // 创建工厂
};

#include "factory.h"
#include "product.h"
// 奔驰工厂
class BenzFactory : public AFactory
{
public:
    ICar* CreateCar() {
        return new BenzCar();
    }
    IBike* CreateBike() {
        return new BenzBike();
    }
};
// 宝马工厂
class BmwFactory : public AFactory
{
public:
    ICar* CreateCar() {
        return new BmwCar();
    }
    IBike* CreateBike() {
        return new BmwBike();
    }
};
// 奥迪工厂
class AudiFactory : public AFactory
{
public:
    ICar* CreateCar() {
        return new AudiCar();
    }
    IBike* CreateBike() {
        return new AudiBike();
    }
};
// 创建工厂
AFactory* AFactory::CreateFactory(FACTORY_TYPE factory)
{
       AFactory* pFactory = NULL;
       switch (factory) {
       case FACTORY_TYPE::BENZ_FACTORY:  // 奔驰工厂
              pFactory = new BenzFactory();
              break;
       case FACTORY_TYPE::BMW_FACTORY:  // 宝马工厂
              pFactory = new BmwFactory();
              break;
       case FACTORY_TYPE::AUDI_FACTORY:  // 奥迪工厂
              pFactory = new AudiFactory();
              break;
       default:
              break;
       }
       return pFactory;
}

#include "factory.h"
#include "product.h"
#include <iostream>
using namespace std;
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
int main()
{
       // 奔驰
       AFactory* pFactory =  AFactory::CreateFactory(AFactory::FACTORY_TYPE::BENZ_FACTORY);
       ICar* pCar = pFactory->CreateCar();
       IBike* pBike = pFactory->CreateBike();
       cout << "Benz factory - Car: " << pCar->Name() << endl;
       cout << "Benz factory - Bike: " << pBike->Name() << endl;
       SAFE_DELETE(pCar);
       SAFE_DELETE(pBike);
       SAFE_DELETE(pFactory);
       // 宝马
       pFactory = AFactory::CreateFactory(AFactory::FACTORY_TYPE::BMW_FACTORY);
       pCar = pFactory->CreateCar();
       pBike = pFactory->CreateBike();
       cout << "Bmw factory - Car: " << pCar->Name() << endl;
       cout << "Bmw factory - Bike: " << pBike->Name() << endl;
       SAFE_DELETE(pCar);
       SAFE_DELETE(pBike);
       SAFE_DELETE(pFactory);
       // 奥迪
       pFactory = AFactory::CreateFactory(AFactory::FACTORY_TYPE::AUDI_FACTORY);
       pCar = pFactory->CreateCar();
       pBike = pFactory->CreateBike();
       cout << "Audi factory - Car: " << pCar->Name() << endl;
       cout << "Audi factory - Bike: " << pBike->Name() << endl;
       SAFE_DELETE(pCar);
       SAFE_DELETE(pBike);
       SAFE_DELETE(pFactory);
       getchar();
       return 0;
}

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

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

相关文章

【2251. 花期内花的数目】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个下标从 0 开始的二维整数数组 flowers &#xff0c;其中 flowers[i] [starti, endi] 表示第 i 朵花的 花期 从 starti 到 endi &#xff08;都 包含&#xff09;。同时给你一个下标从 0 开始…

jeecgboot-3.5.5本地安装部署

一、开发环境说明 1、jdk1.8&#xff1a;java运行环境 2、Maven&#xff1a;项目依赖管理 3、git&#xff1a;代码管理 4、mysql5.7:数据管理。也可以是orcale、pgsql等 华为云HECS云服务器docker环境下安装mysql_supersolon的博客-CSDN博客 5、redis&#xff1a;缓存管理…

Goby 漏洞发布|Cockpit 平台 upload 文件上传漏洞(CVE-2023-1313)

漏洞名称&#xff1a;Cockpit 平台 upload 文件上传漏洞&#xff08;CVE-2023-1313&#xff09; English Name&#xff1a; Cockpit File Upload Vulnerability(CVE-2023-1313) CVSS core:7.2 影响资产数&#xff1a;3185 漏洞描述&#xff1a; Cockpit 是一个自托管、灵活…

[C++ 网络协议] 重叠I/O模型

目录 1. 什么是重叠I/O模型 2. 重叠I/O模型的实现 2.1 创建重叠非阻塞I/O模式的套接字 2.2 执行重叠I/O的Send函数 2.3 执行重叠I/O的Recv函数 2.4 获取执行I/O重叠的函数的执行结果 2.5 重叠I/O的I/O完成确认 2.5.1 使用事件对象&#xff08;使用重叠I/O函数的第六个参…

【x265 源码分析系列】:概述

介绍 x265 也属于 VLC 的 project。 版本&#xff1a; x265-3.5&#xff08;TAG-208&#xff09; git&#xff1a; https://bitbucket.org/multicoreware/x265_git.git 编码特点&#xff1a; 研究了一段时间的 HEVC 编码标准&#xff0c;最近开始研究符合 HEVC 标准的开源…

STM32G070RBT6-MCU温度测量(ADC)

1、借助STM32CubeMX生成系统及外设相关初始化代码。 在以上配置后就可以生成相关初始化代码了。 /* ADC1 init function */ void MX_ADC1_Init(void) {/* USER CODE BEGIN ADC1_Init 0 *//* USER CODE END ADC1_Init 0 */ADC_ChannelConfTypeDef sConfig {0};/* USER COD…

MyBatis-Plus通用Service快速实现赠三改查[MyBatis-Plus系列] - 第489篇

历史文章&#xff08;文章累计480&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 M…

综述 | 关于点云配准的全面综述(二)

原创 | 文 BFT机器人 05 基于优化的配准方法 基于优化的方法的关键思想是开发复杂的优化策略来实现方程&#xff08;1&#xff09;中非线性问题的最优解。 由于同源挑战的影响&#xff0c;这个非线性问题变得具有挑战性。图&#xff08;2a&#xff09;总结了该类别的主要过程。…

从零开始之了解电机及其控制(11)实现空间矢量调制

广泛地说&#xff0c;空间矢量调制只是将电压矢量以及磁场矢量在空间中调制到任意角度&#xff0c;通常同时最大限度地利用整个电压范围。 其他空间矢量调制模式确实存在&#xff0c;并且根据您最关心的内容&#xff0c;它们可能值得研究。 如何实际执行这种所谓的交替反向序列…

看看属猴人性格及近几年的运势怎么样?

属猴的人五行主金&#xff0c;乃是申金之所在&#xff0c;金旺之人&#xff0c;外显懒散&#xff0c;内心富有主见&#xff0c;行事坚定&#xff0c; 有贯彻始终之斗志&#xff0c;与他人合作融洽&#xff0c;且得以财运颇多&#xff1b; 主金&#xff0c;杀伐果决、精明干练&a…

PHP各种老版本下载方式

最近因工作需要&#xff0c;要下载PHP7.3的最新版本版本。 PHP官网上提供了各种老版本下载地址&#xff1a; https://windows.php.net/downloads/releases/archives/ 下载速度不稳定&#xff0c;时快时慢。 使用前&#xff0c;给下载留足时间。 貌似晚上速度快一些。

gif怎么转换成视频MP4?

gif怎么转换成视频MP4&#xff1f;GIF动图已成为一种风靡网络的流行的特殊图片文件&#xff0c;其循环播放和逐帧呈现的特点使其在社交媒体、聊天应用等场合广泛应用&#xff0c;平时我们进行群聊是&#xff0c;大家总会一些gif动态表情的出现而感觉非常的开行&#xff0c;gif动…

Android12之容器类SortedVector、KeyedVector、Vector、VectorImpl总结(一百六十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

极致增长 | NetMarvel 程序化广告最大化广告变现收益

程序化广告已彻底改变广告主触达目标受众的方式。 从早期传统人工售卖流量&#xff0c;到流量平台推出广告联盟&#xff0c;从程序化交易到利用算法和机器学习实时计算买卖广告空间&#xff0c;通过逐渐精微的数据来测评不同渠道、不同受众的广告效果&#xff0c;提高广告主的…

datart:Invalid database configuration. Datart is running in demo mode

datart在IDEA配置好数据库连接之后&#xff0c;启动&#xff0c;报错&#xff1a; 【********* Invalid database configuration. Datart is running in demo mode *********】 原因是缺少一个变量 config 增加即可&#xff1a; 再次启动&#xff0c;就不会报无效数据库配置了…

百华鞋业董事长牛兴华应邀出席德国前总统武尔夫欢迎宴会

2023年9月25日&#xff0c;德国前总统克里斯蒂安-武尔夫&#xff08;Christian Wullff&#xff09;一行来华访问期间&#xff0c;于上海新华联索菲特举办2023中德交流领袖论坛暨武尔夫总统欢迎晚宴。百华鞋业董事长牛兴华先生受邀出席&#xff0c;并受到武尔夫的亲自接见。 山东…

关于NVIC 中断控制器的中断配置。

以下图片均来自NVIC控制器内容。 M3处理器仅实现了每个81个中断&#xff0c;每个中断的优先级由高4位控制。 这里的组优先级我认为是抢占式优先级。

多线程批量下载ERA5逐日数据

介绍 这篇博文主要是整了和ERA5官方参考文档和网上现有的代码&#xff0c;从而实现ERA5逐日数据的批量下载**&#xff08;可指定时区&#xff09;**。 先前准备 在使用python批量下载ERA5逐日数据前我们需要手动配置一下cdsapi 1.访问&#xff1a;CDS官网并注册账号 2.注册好…

掌动智能:UI自动化测试工具的重要性和应用

在软件开发过程中&#xff0c;测试是至关重要的环节。而UI自动化测试工具则成为了测试团队提高效率、降低成本、保证软件质量的重要利器。本文将介绍UI自动化测试工具的概念和重要性&#xff0c;并探讨其在软件开发中的应用和好处。 一、UI自动化测试工具的概念 UI自动化测试工…

获奖作品展示 | 2023嵌入式大赛AidLux系列作品精彩纷呈

第六届&#xff08;2023&#xff09;全国大学生嵌入式芯片与系统设计竞赛应用赛道全国总决赛已于8月下旬圆满结束。 本届赛事中&#xff0c;AidLux是广和通5G智能物联网赛题的唯一软件支持&#xff0c;阿加犀为该赛题学生们提供了全程线上辅导、技术答疑&#xff0c;以及大赛专…