「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)详解

一、引言

在面向对象编程中,设计模式是解决问题的最佳实践。抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来封装一组具有共同主题的单个工厂,而不需要指定它们的具体类。该模式允许客户端使用抽象的接口来创建一系列相关或依赖的对象,而无需关心具体的实现细节。本文将详细介绍C++中的抽象工厂模式,包括其定义、结构、优点、缺点以及应用场景。

二、定义

抽象工厂模式定义了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。该模式主要由四个部分组成:抽象工厂、具体工厂、抽象产品和具体产品。

  1. 抽象工厂(Abstract Factory):声明一个用于创建对象的接口。
  2. 具体工厂(Concrete Factory):实现抽象工厂接口,创建具体产品的实例。
  3. 抽象产品(Abstract Product):声明产品的接口。
  4. 具体产品(Concrete Product):实现抽象产品接口,是具体工厂创建的对象。

三、结构

以下是抽象工厂模式的典型结构:

cpp 复制代码
// 抽象产品:汽车
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();
    }
};

四、使用示例

以下是如何使用抽象工厂模式的示例代码:

cpp 复制代码
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. 系统需要提供产品库的类,且只想显示它们的接口而不是实现

八、总结

抽象工厂模式是一种强大的设计模式,它允许我们在不修改客户端代码的情况下,通过更换具体工厂来改变系统的行为。然而,该模式也增加了系统的复杂度和代码量,因此在选择使用时应谨慎考虑。合理地使用抽象工厂模式,可以显著提高代码的可读性、可维护性和可扩展性。


相关推荐
项目題供诗几秒前
C语言基础(六)
c语言·开发语言
_OP_CHEN8 分钟前
【算法基础篇】(四十七)乘法逆元终极宝典:从模除困境到三种解法全解析
c++·算法·蓝桥杯·数论·算法竞赛·乘法逆元·acm/icpc
杭州杭州杭州8 分钟前
pta考试
数据结构·c++·算法
是娇娇公主~9 分钟前
C++集群聊天服务器(1)—— muduo网络库服务器编程
服务器·网络·c++
carver w12 分钟前
张氏相机标定,不求甚解使用篇
c++·python·数码相机
Remember_99323 分钟前
【数据结构】初识 Java 集合框架:概念、价值与底层原理
java·c语言·开发语言·数据结构·c++·算法·游戏
郝学胜-神的一滴27 分钟前
QtOpenGL多线程渲染方案深度解析
c++·qt·unity·游戏引擎·godot·图形渲染·unreal engine
小乔的编程内容分享站33 分钟前
C语言结构体相关笔记
c语言·笔记
Engineer邓祥浩36 分钟前
设计模式学习(14) 23-12 代理模式
学习·设计模式·代理模式
陌路2042 分钟前
RPC分布式通信(2)---四种典型式线程池(1)
java·开发语言·c++