【C++ | 设计模式】抽象工厂模式的详解与实现

news2024/11/23 23:37:00

1. 概念

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。它允许客户端代码通过工厂接口来创建一组对象,而无需了解它们的具体实现细节。

2. 结构

抽象工厂模式通常包括以下几个角色:

  1. AbstractFactory: 抽象工厂接口,声明了创建一系列产品的方法。

  2. ConcreteFactory: 具体工厂,实现 AbstractFactory 接口,创建具体的产品对象。

  3. AbstractProduct: 抽象产品接口,为每种产品定义一个接口。

  4. ConcreteProduct: 具体产品,实现 AbstractProduct 接口,提供产品的具体实现。

  5. Client: 使用抽象工厂和抽象产品接口来实现业务逻辑,无需了解具体的产品类。

3. UML 结构图:

4. 优缺点

优点:

  1. 解耦: 客户端与具体的产品类解耦,客户端只需依赖于抽象接口。
  2. 扩展性: 增加新的产品系列时,只需添加新的工厂和产品类,客户端代码不需要修改。
  3. 一致性: 可以确保一组产品的一致性,因为工厂创建的产品彼此兼容。

缺点:

  1. 增加系统复杂性: 由于需要增加许多抽象类和具体类,系统结构变得复杂。
  2. 难以支持新产品: 如果需要支持新的产品类型,可能需要修改工厂接口,影响已有的代码。

5. 适用场景

  • 多种产品的系列: 当系统需要处理一系列相关的产品,但客户端代码不知道具体的产品类时,抽象工厂模式是合适的选择。
  • 产品兼容性: 当系统中的产品需要保持一致性或兼容性时(例如,一个操作系统的UI库),抽象工厂模式可以帮助管理和维护这些产品的一致性。
  • 产品家族: 需要在产品家族中选择不同的产品时(例如,不同操作系统上的UI组件),抽象工厂模式提供了一种优雅的解决方案。

6. 代码示例

工厂方法模式要求产品必须为同一类型,也就是说,BBA 的工厂只能生产各自的汽车,要生产其他产品(例如:自行车)是不行的,这显然限制了产品的扩展。为了解决这个问题,抽象工厂模式出现了 - 将产品归类分组,然后将好几组产品构成一族。每个工厂负责生产一族产品,而工厂中的每个方法负责生产一种类型的产品。

这样,客户端只需要创建具体工厂的实例,然后调用工厂对象的工厂方法就可以得到所需要的产品对象。

#include <iostream>
#include <string>

// 抽象产品:汽车
class Car {
public:
    virtual void drive() = 0;  // 纯虚函数:驱动汽车
};

// 具体产品:奔驰汽车
class MercedesCar : public Car {
public:
    void drive() override {
        std::cout << "Driving a Mercedes car." << std::endl;
    }
};

// 具体产品:宝马汽车
class BMWCar : public Car {
public:
    void drive() override {
        std::cout << "Driving a BMW car." << std::endl;
    }
};

// 具体产品:奥迪汽车
class AudiCar : public Car {
public:
    void drive() override {
        std::cout << "Driving an Audi car." << std::endl;
    }
};

// 抽象产品:自行车
class Bicycle {
public:
    virtual void ride() = 0;  // 纯虚函数:骑自行车
};

// 具体产品:奔驰自行车
class MercedesBicycle : public Bicycle {
public:
    void ride() override {
        std::cout << "Riding a Mercedes bicycle." << std::endl;
    }
};

// 具体产品:宝马自行车
class BMWBicycle : public Bicycle {
public:
    void ride() override {
        std::cout << "Riding a BMW bicycle." << std::endl;
    }
};

// 具体产品:奥迪自行车
class AudiBicycle : public Bicycle {
public:
    void ride() override {
        std::cout << "Riding an Audi bicycle." << std::endl;
    }
};

// 抽象工厂
class VehicleFactory {
public:
    virtual Car* createCar() = 0;  // 纯虚函数:创建汽车
    virtual Bicycle* createBicycle() = 0;  // 纯虚函数:创建自行车
};

// 具体工厂:奔驰工厂
class MercedesFactory : public VehicleFactory {
public:
    Car* createCar() override {
        return new MercedesCar();  // 创建奔驰汽车
    }
    
    Bicycle* createBicycle() override {
        return new MercedesBicycle();  // 创建奔驰自行车
    }
};

// 具体工厂:宝马工厂
class BMWFactory : public VehicleFactory {
public:
    Car* createCar() override {
        return new BMWCar();  // 创建宝马汽车
    }
    
    Bicycle* createBicycle() override {
        return new BMWBicycle();  // 创建宝马自行车
    }
};

// 具体工厂:奥迪工厂
class AudiFactory : public VehicleFactory {
public:
    Car* createCar() override {
        return new AudiCar();  // 创建奥迪汽车
    }
    
    Bicycle* createBicycle() override {
        return new AudiBicycle();  // 创建奥迪自行车
    }
};

// 客户端代码:使用工厂创建产品
void testVehicleFactory(VehicleFactory* factory) {
    Car* car = factory->createCar();  // 创建汽车
    Bicycle* bicycle = factory->createBicycle();  // 创建自行车

    car->drive();  // 驱动汽车
    bicycle->ride();  // 骑自行车

    delete car;  // 释放汽车内存
    delete bicycle;  // 释放自行车内存
}

int main() {
    VehicleFactory* factory = new MercedesFactory();  // 使用奔驰工厂
    testVehicleFactory(factory);
    delete factory;

    factory = new BMWFactory();  // 使用宝马工厂
    testVehicleFactory(factory);
    delete factory;

    factory = new AudiFactory();  // 使用奥迪工厂
    testVehicleFactory(factory);
    delete factory;

    return 0;
}

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

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

相关文章

从暴力到秩序:解锁权力奥秘

从暴力到秩序&#xff1a;解锁权力奥秘 - 孔乙己大叔权力的诞生 在人类社会的最初形态中&#xff0c;权力往往源自最原始的力量——暴力。一个人&#xff0c;起初仅拥有一把枪&#xff0c;他的权力简单而直接&#xff1a;决定对谁开枪。然而&#xff0c;随着他利用这把…

【58同城-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

【Scala】Windows下安装Scala(全面)

目录 1.下载 2.安装 3.配置环境变量 1.新增系统环境变量 2.环境变量Path 4.验证 1.下载 官网下载地址&#xff1a;https://downloads.lightbend.com/scala/2.11.12/scala-2.11.12.msi 2.安装 双击下载的.msi文件&#xff1a; 勾选"I accept the terms in the Li…

Flink 1.14.* Flink窗口创建和窗口计算源码

解析Flink如何创建的窗口&#xff0c;和以聚合函数为例&#xff0c;窗口如何计算聚合函数 一、构建不同窗口的build类1、全局窗口2、创建按键分流后的窗口 二、在使用窗口处理数据流时&#xff0c;不同窗口创建的都是窗口算子WindowOperator1、聚合函数实现2、创建全局窗口(入参…

智能合约开发与测试1

智能合约开发与测试 任务一&#xff1a;智能合约设计 &#xff08;1&#xff09;编写新能源智能合约功能需求文档。 区块链新能源管理智能合约功能需求包括资产与能源绑定、用户管理、能源交易、智能结算等&#xff0c;确保安全性、隐私保护和可扩展性&#xff0c;提高能源利…

2024年第六届控制与机器人国际会议(ICCR 2024)即将召开!

2024年第六届控制与机器人国际会议&#xff08;ICCR 2024&#xff09;将于2024年12月5日至7日在日本横滨举行。智能机器人结合了多种概念、学科和技术&#xff0c;共同创造出各种有用的设备、操作器和自主实体&#xff0c;为特定人类社区服务&#xff0c;如制造设备、医疗和远程…

【练习】哈希表的使用

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.哈希表简介 2.两数之和 题目描述 题解 代码实现 2.面试题.判定是否…

代码随想录Day 28|题目:122.买卖股票的最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ、1005.K次取反后最大化的数组和

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一&#xff1a;122.买卖股票的最佳时机 II贪心算法&#xff1a;动态规划 题目二&#xff1a;55.跳跃游戏解题思路&#xff1a; 题目三&#xff1a; 45.跳跃游戏 II解题思路方法一方法二 题…

在Centos中的mysql的备份与恢复

1.物理备份 冷备份&#xff1a;关闭数据库时进行热备份&#xff1a;数据库运行时进行&#xff0c;依赖于数据库日志文件温备份&#xff1a;数据库不可写入但可读的状态下进行 2.逻辑备份 对数据库的表或者对象进行备份 3.备份策略 完全备份&#xff1a;每次都备份完整的数…

每日OJ_牛客_Rational Arithmetic(英文题模拟有理数运算)

目录 牛客_Rational Arithmetic&#xff08;英文题模拟有理数运算&#xff09; 解析代码 牛客_Rational Arithmetic&#xff08;英文题模拟有理数运算&#xff09; Rational Arithmetic (20)__牛客网 解析代码 本题看上去不难&#xff0c;但是存在几个问题&#xff1a; 除…

【C++】汇编分析

传参 有的是用寄存器传参&#xff0c;有的用push传参 我在MSVC编译测出来的是PUSH传参&#xff08;debug模式&#xff09;&#xff0c;具体过程如下 long func(long a, long b, long c, long d,long e, long f, long g, long h) {long sum;sum (a b c d e f g h);ret…

《机器学习》文本数据分析之关键词提取、TF-IDF、项目实现 <上>

目录 一、如何进行关键词提取 1、关键词提取步骤 1&#xff09;数据收集 2&#xff09;数据准备 3&#xff09;模型建立 4&#xff09;模型结果统计 5&#xff09;TF-IDF分析 2、什么是语料库 3、如何进行中文分词 1&#xff09;导包 2&#xff09;导入分词库 3&#xff09…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(SVM分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;SVM分类器&#xff09; 文章目录 一、基本原理鲸鱼智能优化特征选择&#xff08;WOA&#xff09;结合SVM分类器的详细原理和流程原理流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化…

js | XMLHttpRequest

是什么&#xff1f; 和serve交互数据的对象&#xff1b;能够达到页面部分刷新的效果&#xff0c;也就是获取数据之后&#xff0c;不会使得整个页面都刷新&#xff1b;虽然名字是XML&#xff0c;但不限于XML数据。 怎么用&#xff1f; function reqListener() {console.log(thi…

理解数据库系统的内部结构

数据库系统在我们的数字世界中扮演着关键角色。本文将介绍数据库系统的内部结构&#xff0c;帮助初学者了解其基本概念。 数据库系统的三级模式 数据库系统内部采用三级模式二级映像结构&#xff0c;包括外模式、模式和内模式。这种结构确保了数据的逻辑独立性和物理独立性。…

全能型AI vs 专业型AI:未来是草莓味的AI吗?

草莓&#xff1a;全能型AI的新宠儿&#xff1f; 根据最近的消息&#xff0c;OpenAI的“草莓”模型据说是一个全能型AI&#xff0c;无论是解数学题还是搞定主观营销策略&#xff0c;它都能轻松驾驭。这个AI不仅仅是能解决问题&#xff0c;更是能够跨越多个领域&#xff0c;展现出…

C++学习/复习补充记录 --- 图论(深搜,广搜)

数据结构与算法 | 深搜&#xff08;DFS&#xff09;与广搜&#xff08;BFS&#xff09;_深搜广搜算法-CSDN博客 深度优先搜索理论基础 深搜和广搜的区别&#xff1a; &#xff08;通俗版&#xff09; dfs是可一个方向去搜&#xff0c;不到黄河不回头&#xff0c;直到遇到绝境了…

消费电子钛时代到来!天工股份抢占发展高地,业绩爆发式增长、前景广阔

消费电子“钛时代”正加速到来。 27日凌晨&#xff0c;苹果正式定档iPhone 16系列新品的发布会日期。据悉&#xff0c;本次iPhone 16 Pro系列将全系标配钛金属中框&#xff0c;继续沿用并升级此前在iPhone 15 Pro系列上应用的钛金属材质。 回看去年9月秋季新品发布会&#xf…

三秒学会--百度网盘下载提速10倍的小tip

开启优化速率 从2mb-->20mb 纵享新丝滑~

PHP安装扩展包时忽略依赖强制安装

正常安装时会检查依赖包&#xff0c;比如是否安装了reids扩展&#xff0c;是否安装了gd库等&#xff0c;卖到依赖包安装失败。 如下提示&#xff1a; 这样会导致你的包安装不上。 使用下面命令&#xff0c;强制安装&#xff0c;如下&#xff1a; 加上 --ignore-platform-req…