抽象工厂模式

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。它对客户端代码隐藏了实现细节,客户端不用关心某一系列产品的具体名称。客户端只知道这一系列产品中的具体产品的共同行为。而且它也只关心共同行为。

考虑全屋定制家具场景:一个家庭都需要沙发、椅子、桌子等等家具。客户偏好的风格可能是不同的,有的客户喜欢西式,有的客户喜欢中式。西式和中式的沙发、椅子、桌子是不同风格。现在要根据客户不同的偏好创建不同的沙发、椅子等。这时就适合抽象工厂模式发挥作用。

如果不使用抽象工厂,会怎么做呢?

如果客户喜欢中式
   创建中式沙发
   创建中式椅子
   创建中式桌子
如果客户喜欢西式
   创建西式沙发
   创建西式椅子
   创建西式桌子
···

使用抽象工厂

如果客户喜欢中式
   创建中式工厂
如果客户喜欢西式工厂
   创建西式工厂
···
工厂创建沙发
工厂创建椅子
工厂创建桌子

如果增加一种风格,客户相关的代码只需要增加客户偏好的判断即可,其他增加新的类就好。如果突然流行苏州中式风格的家具。客户端代码不用动,只需修改中式工厂代码即可。

类图

2024-01-07T23:31:26.png

示例代码

#include <iostream>

// 1. 抽象产品 - 沙发
class Sofa {
public:
    virtual void sit() const = 0;
};

// 2. 具体产品 - 西式沙发
class WesternSofa : public Sofa {
public:
    void sit() const override {
        std::cout << "Sitting on Western Sofa" << std::endl;
    }
};

// 3. 具体产品 - 中式沙发
class ChineseSofa : public Sofa {
public:
    void sit() const override {
        std::cout << "Sitting on Chinese Sofa" << std::endl;
    }
};

// 4. 抽象产品 - 椅子
class Chair {
public:
    virtual void sit() const = 0;
};

// 5. 具体产品 - 西式椅子
class WesternChair : public Chair {
public:
    void sit() const override {
        std::cout << "Sitting on Western Chair" << std::endl;
    }
};

// 6. 具体产品 - 中式椅子
class ChineseChair : public Chair {
public:
    void sit() const override {
        std::cout << "Sitting on Chinese Chair" << std::endl;
    }
};

// 7. 抽象产品 - 桌子
class Table {
public:
    virtual void eat() const = 0;
};

// 8. 具体产品 - 西式桌子
class WesternTable : public Table {
public:
    void eat() const override {
        std::cout << "Eating on Western Table" << std::endl;
    }
};

// 9. 具体产品 - 中式桌子
class ChineseTable : public Table {
public:
    void eat() const override {
        std::cout << "Eating on Chinese Table" << std::endl;
    }
};

// 10. 抽象工厂
class FurnitureFactory {
public:
    virtual Sofa* createSofa() const = 0;
    virtual Chair* createChair() const = 0;
    virtual Table* createTable() const = 0;
};

// 11. 具体工厂 - 西式家具工厂
class WesternFurnitureFactory : public FurnitureFactory {
public:
    Sofa* createSofa() const override {
        return new WesternSofa();
    }

    Chair* createChair() const override {
        return new WesternChair();
    }

    Table* createTable() const override {
        return new WesternTable();
    }
};

// 12. 具体工厂 - 中式家具工厂
class ChineseFurnitureFactory : public FurnitureFactory {
public:
    Sofa* createSofa() const override {
        return new ChineseSofa();
    }

    Chair* createChair() const override {
        return new ChineseChair();
    }

    Table* createTable() const override {
        return new ChineseTable();
    }
};

int main() {
    // 使用抽象工厂创建家具实例
    int preference = 0
    FurnitureFactory* factory;
    if preference == 1 {
        //中式
        factory = new ChineseFurnitureFactory();
    }
    else if preference == 2 {
        //西式
        factory = new WesternFurnitureFactory();
    }
    
    Sofa* sofa = factory->createSofa();
    Chair* chair = factory->createChair();
    Table* table = factory->createTable();

    // 使用家具
    sofa->sit();
    chair->sit();
    table->eat();

    // 释放资源
    delete factory;
    delete sofa;
    delete chair;
    delete table;

    return 0;
}