当前位置: 首页 > news >正文

c++注意点(13)----设计模式(抽象工厂)

创建型模式

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

        简单说,它就像一个 "超级工厂",可以生产一整套配套的产品,而不是单一产品。比如说GUI,在windows平台使用windows风格,mac使用mac风格。

为什么需要抽象工厂模式?

以电子设备工厂为例,我们可以清晰看到为什么需要抽象工厂模式:

  1. 产品族管理:每个品牌(苹果、华为)都有一套配套产品(手机、电脑、平板),抽象工厂确保这些产品能协同工作(如生态互联)
  2. 隔离具体实现:用户不需要知道 "iPhone 15" 的具体细节,只需知道 "这是苹果手机"
  3. 轻松切换品牌:从苹果全家桶换成华为全家桶时,只需更换工厂,无需修改使用产品的代码
  4. 符合开闭原则:新增小米工厂时,无需修改现有代码,只需实现新的工厂和产品

示例

        看代码是最好理解的方法。可以看到,这里是多个工厂,每个工厂对应多个不同的设备的。

#include <iostream>
#include <string>// 抽象产品:手机
class Phone {
public:virtual ~Phone() = default;virtual std::string getName() const = 0;
};// 抽象产品:电脑
class Computer {
public:virtual ~Computer() = default;virtual std::string getName() const = 0;
};// 抽象产品:平板
class Tablet {
public:virtual ~Tablet() = default;virtual std::string getName() const = 0;
};// 具体产品:苹果手机
class IPhone : public Phone {
public:std::string getName() const override {return "iPhone 15";}
};// 具体产品:苹果电脑
class Mac : public Computer {
public:std::string getName() const override {return "MacBook Pro";}
};// 具体产品:苹果平板
class IPad : public Tablet {
public:std::string getName() const override {return "iPad Pro";}
};// 具体产品:华为手机
class HuaweiPhone : public Phone {
public:std::string getName() const override {return "Huawei Mate 60";}
};// 具体产品:华为电脑
class HuaweiComputer : public Computer {
public:std::string getName() const override {return "Huawei MateBook X Pro";}
};// 具体产品:华为平板
class HuaweiTablet : public Tablet {
public:std::string getName() const override {return "Huawei MatePad Pro";}
};// 抽象工厂:电子设备工厂
class ElectronicFactory {
public:virtual ~ElectronicFactory() = default;virtual Phone* createPhone() const = 0;virtual Computer* createComputer() const = 0;virtual Tablet* createTablet() const = 0;
};// 具体工厂:苹果工厂
class AppleFactory : public ElectronicFactory {
public:Phone* createPhone() const override {return new IPhone();}Computer* createComputer() const override {return new Mac();}Tablet* createTablet() const override {return new IPad();}
};// 具体工厂:华为工厂
class HuaweiFactory : public ElectronicFactory {
public:Phone* createPhone() const override {return new HuaweiPhone();}Computer* createComputer() const override {return new HuaweiComputer();}Tablet* createTablet() const override {return new HuaweiTablet();}
};// 客户端代码:使用电子设备
void useElectronicDevices(const ElectronicFactory& factory) {Phone* phone = factory.createPhone();Computer* computer = factory.createComputer();Tablet* tablet = factory.createTablet();std::cout << "使用的电子设备:" << std::endl;std::cout << "- 手机:" << phone->getName() << std::endl;std::cout << "- 电脑:" << computer->getName() << std::endl;std::cout << "- 平板:" << tablet->getName() << std::endl;delete phone;delete computer;delete tablet;
}int main() {// 使用苹果设备std::cout << "=== 苹果生态 ===" << std::endl;AppleFactory appleFactory;useElectronicDevices(appleFactory);// 切换到华为设备,无需修改useElectronicDevices函数std::cout << "\n=== 华为生态 ===" << std::endl;HuaweiFactory huaweiFactory;useElectronicDevices(huaweiFactory);return 0;
}
http://www.lryc.cn/news/600017.html

相关文章:

  • 医疗器械:DFEMA和PFEMA
  • 从数据脱敏到SHAP解释:用Streamlit+XGBoost构建可复现的川崎病诊断系统
  • [NLP]一个完整的 UPF 文件示例
  • 文心4.5横向对标全球大模型:技术突破与应用前景深度分析
  • OSPF 路由协议多区域
  • 利用Dify实现应用日志关键信息提取之实践
  • 九联UNT413AS_晶晨S905L3S芯片_2+8G_安卓9.0_线刷固件包
  • RK3588 HDMI-RX 驱动、RGA 加速与 OpenCV GStreamer 支持完整指南
  • React性能优化终极指南:memo、useCallback、useMemo全解析
  • 堆(Heap)优先级队列(Priority Queue)
  • python基础:request模块简介与安装、基本使用,如何发送get请求响应数据,response属性与请求头
  • 《计算机组成原理与汇编语言程序设计》实验报告一 基本数字逻辑及汉字显示
  • 机器学习详解(28):LightGBM原理
  • Linux系统编程——进程
  • 腾讯云CodeBuddy+微信小程序:5分钟开发番茄小闹钟
  • IPv6,你开始使用了吗?
  • 学习日志18 python
  • 从入门到进阶:JavaScript 学习之路与实战技巧
  • [科普] 快速傅里叶变换(FFT)和离散傅里叶变换(DFT)的差异
  • JDK8保姆级安装教程
  • 微观低代码
  • 前端项目组成
  • 【DeepRare】疾病识别召回率100%
  • Linux parted问题:指定分区边界失效
  • HTTP响应状态码详解
  • Java 常用数据库详解
  • 数据结构 之 【排序】(递归实现快速排序)
  • 【补题】Codeforces Round 735 (Div. 2) B. Cobb
  • 中国移动融合企业网关H10G-13-中星微ZX296716处理器-破解教程
  • 基于springboot的小区车位租售管理系统