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

「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.kler.cn/a/372815.html

相关文章:

  • (五)Web前端开发进阶2——AJAX
  • 为什么 C 语言数组是从 0 开始计数的?
  • git快速合并代码dev->master
  • ReactNative Fabric渲染器和组件(5)
  • 部署Leanote 蚂蚁笔记
  • HTML的CSS
  • HTTP相关返回值异常原因分析,第二部分
  • Mac在Typora配置PicGo图床,以github为例
  • rsync异地备份
  • 详解机器学习经典模型(原理及应用)——朴素贝叶斯
  • 【iOS】YYModel初学习
  • ssm014基于JSP的乡镇自来水收费系统+jsp(论文+源码)_kaic
  • 图书管理系统汇报
  • 全面掌握数据库性能监控:策略、工具与实践
  • C语言中有哪些函数可以用来处理二进制和十六进制数字
  • 人工智能算法之粒子群优化算法
  • Yii2 init 初始化脚本分析
  • 无人机遗传算法详解!
  • Virtual Private Network (VPN) Lab
  • 在MacOS玩RPG游戏 - RPGViewerPlus
  • 【论文笔记】xGen-MM (BLIP-3): A Family of Open Large Multimodal Models
  • 【Android】Kotlin教程(5)
  • react基础之redux快速上手环境准备
  • 【Docker知识】Docker进阶-容器镜像深度解读
  • SQL 高级技巧
  • BERT的中文问答系统23