Bootstrap

「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):实现抽象产品接口,是具体工厂创建的对象。

三、结构

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

// 抽象产品:汽车
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. 系统需要提供产品库的类,且只想显示它们的接口而不是实现

八、总结

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


在这里插入图片描述

;