简介

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
它属于工厂模式的一种,与工厂方法模式相比,抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而工厂方法模式只能创建单一产品。
在抽象工厂模式中,有一个抽象工厂类,它定义了一组用于创建一系列产品的接口。

描述

抽象工厂模式通过抽象工厂类和具体工厂类之间的继承关系来实现,在抽象工厂类中定义了用于创建一系列产品的接口,而具体工厂类则实现了这些接口,从而具体创建了一系列相互依赖的产品。每个具体工厂类只能创建一批相关的产品,这些产品组成了一个产品族。在客户端代码中只需要调用抽象工厂类的方法,即可创建一组相关的产品。

原理

抽象工厂模式的关键是抽象工厂类,它定义了一系列用于创建一组相关产品的方法,在客户端代码中只需要使用抽象工厂类来实现具体的产品创建,而无需关心每个产品的具体实现。具体工厂类则实现了抽象工厂类中定义的方法,从而创建一组相互依赖的产品。

示例

以生产不同系列的电视和空调为例,首先定义一个抽象产品类TV和AbstractAirConditioner,具体产品类SonyTV、SamsungTV、SonyAirConditioner和SamsungAirConditioner继承这些抽象类。
之后定义一个抽象工厂类AbstractFactory,其中含有创建TV和AirConditioner的接口。
具体工厂类SonyFactory和SamsungFactory实现这个接口来创建这些具体的产品。
客户端代码中只需使用这些具体的工厂类调用AbstractFactory的方法来创建不同系列的产品。

#include <iostream>
using namespace std;

// 抽象产品类
class TV {
public:
    virtual void play() = 0;
};

class AbstractAirConditioner {
public:
    virtual void cool() = 0;
};

// 具体产品类
class SonyTV : public TV {
public:
    void play() {
        cout << "Sony TV is playing." << endl;
    }
};

class SamsungTV : public TV {
public:
    void play() {
        cout << "Samsung TV is playing." << endl;
    }
};

class SonyAirConditioner : public AbstractAirConditioner {
public:
    void cool() {
        cout << "Sony air conditioner is cooling." << endl;
    }
};

class SamsungAirConditioner : public AbstractAirConditioner {
public:
    void cool() {
        cout << "Samsung air conditioner is cooling." << endl;
    }
};

// 抽象工厂类
class AbstractFactory {
public:
    virtual TV* createTV() = 0;
    virtual AbstractAirConditioner* createAirConditioner() = 0;
};

// 具体工厂类
class SonyFactory : public AbstractFactory {
public:
    TV* createTV() {
        return new SonyTV();
    }

    AbstractAirConditioner* createAirConditioner() {
        return new SonyAirConditioner();
    }
};

class SamsungFactory : public AbstractFactory {
public:
    TV* createTV() {
        return new SamsungTV();
    }

    AbstractAirConditioner* createAirConditioner() {
        return new SamsungAirConditioner();
    }
};

// 客户端代码
int main() {
    AbstractFactory* factory = new SonyFactory();
    TV* tv = factory->createTV();
    AbstractAirConditioner* ac = factory->createAirConditioner();
    tv->play();
    ac->cool();
    delete tv;
    delete ac;

    factory = new SamsungFactory();
    tv = factory->createTV();
    ac = factory->createAirConditioner();
    tv->play();
    ac->cool();
    delete tv;
    delete ac;

    delete factory;
    return 0;
}

输出结果

Sony TV is playing.
Sony air conditioner is cooling.
Samsung TV is playing.
Samsung air conditioner is cooling.

结论

抽象工厂模式是一种创建一系列相互依赖的产品的设计模式,它通过抽象工厂类和具体工厂类之间的继承关系来实现。它使得客户端代码只需使用抽象工厂类的方法来创建产品,而无需关心每个产品的具体实现。抽象工厂模式适用于一系列相关或相互依赖的产品的创建,同时它具有良好的扩展性,可以方便地扩展新的产品系列。