(4)抽象工厂

抽象工厂模式(Abstract Factory Pattern)的核心在于创建一系列相关或依赖的对象,而无需指定它们的具体类。它适用于需要保证对象族一致性的场景。
抽象工厂最适合的场景是:“一键切换”一整套相互关联的对象,比如:
 - 换操作系统主题
 - 换游戏皮肤
 - 换数据库
 - 换文档格式
 - 换运行环境
 - 它让你的系统灵活、可扩展、高内聚、低耦合,是构建大型可配置系统的利器。
举例
// ============ 产品接口基类 ============
// 按钮接口
class Button {
public:
    virtual ~Button() = default;
    virtual void render() = 0;
};

// 文本框接口
class TextBox {
public:
    virtual ~TextBox() = default;
    virtual void display() = 0;
};
// ============ 具体产品:Windows 风格 ============
class WinButton : public Button {
public:
    void render() override {
        std::cout << "[Windows] 渲染按钮\n";
    }
};
class WinTextBox : public TextBox {
public:
    void display() override {
        std::cout << "[Windows] 显示文本框\n";
    }
};
// ============ 具体产品:Mac 风格 ============
class MacButton : public Button {
public:
    void render() override {
        std::cout << "[Mac] 渲染按钮\n";
    }
};
class MacTextBox : public TextBox {
public:
    void display() override {
        std::cout << "[Mac] 显示文本框\n";
    }
};

抽象工厂接口,生成一整套相关产品基类

class GUIFactory {
public:
    virtual ~GUIFactory() = default;

    virtual std::unique_ptr<Button> createButton() = 0;
    virtual std::unique_ptr<TextBox> createTextBox() = 0;
};
// ============ 具体工厂:Windows 工厂 ============
class WinFactory : public GUIFactory {
public:
    std::unique_ptr<Button> createButton() override {
        return std::make_unique<WinButton>();
    }

    std::unique_ptr<TextBox> createTextBox() override {
        return std::make_unique<WinTextBox>();
    }
};
// ============ 具体工厂:Mac 工厂 ============
class MacFactory : public GUIFactory {
public:
    std::unique_ptr<Button> createButton() override {
        return std::make_unique<MacButton>();
    }

    std::unique_ptr<TextBox> createTextBox() override {
        return std::make_unique<MacTextBox>();
    }
};

调用

// 客户端代码:不关心具体工厂,只依赖抽象
void createUI(std::unique_ptr<GUIFactory> factory) {
    auto button = factory->createButton();
    auto textbox = factory->createTextBox();

    button->render();
    textbox->display();
}
int main() {
    // 创建 Windows 风格 UI
    std::cout << "=== 创建 Windows UI ===\n";
    createUI(std::make_unique<WinFactory>());

    // 创建 Mac 风格 UI
    std::cout << "\n=== 创建 Mac UI ===\n";
    createUI(std::make_unique<MacFactory>());
    return 0;
}
进阶

✅ 减少重复代码
✅ 编译时类型安全
✅ 避免继承和虚函数(可选)
✅ 自动注册和创建
✅ 更现代、更高效的实现

// 基础产品接口(保持不变)
// 具体产品(保持不变)
// 定义产品族标签(用于区分风格)
struct WindowsStyle {};
struct MacStyle {};

// 泛型工厂模板
template <typename Style>
class GUIFactory;

// 特化工厂:Windows 风格工厂
template <>
class GUIFactory<WindowsStyle> {
public:
    static std::unique_ptr<Button> createButton() {
        return std::make_unique<WinButton>();
    }
    static std::unique_ptr<TextBox> createTextBox() {
        return std::make_unique<WinTextBox>();
    }
};

// 特化特化工厂:Mac 风格工厂
template <>
class GUIFactory<MacStyle> {
public:
    static std::unique_ptr<Button> createButton() {
        return std::make_unique<MacButton>();
    }
    static std::unique_ptr<TextBox> createTextBox() {
        return std::make_unique<MacTextBox>();
    }
};
// 通用 (模板)创建 
template <typename Style>
void createUI() {
    auto button = GUIFactory<Style>::createButton();
    auto textbox = GUIFactory<Style>::createTextBox();

    button->render();
    textbox->display();
}
int main() {
    std::cout << "=== Windows 风格 ===\n";
    createUI<WindowsStyle>();

    std::cout << "\n=== Mac 风格 ===\n";
    createUI<MacStyle>();

    return 0;
}
posted @ 2018-12-11 23:54  osbreak  阅读(86)  评论(0)    收藏  举报