抽象工厂设计模式 (Abstract Factory Pattern)

抽象工厂设计模式 (Abstract Factory Pattern)

意图:提供创建相关或依赖对象家族的接口,无需指定具体类。

基础组件
  • AbstractFactory (抽象工厂):声明创建产品族的方法
  • ConcreteFactory (具体工厂):实现创建具体产品的方法
  • AbstractProductA/B (抽象产品):声明产品接口
  • ConcreteProductA/B (具体产品):实现特定产品
继承/实现关系
AbstractFactory <|-- ConcreteFactory
AbstractProductA <|-- ConcreteProductA1
AbstractProductA <|-- ConcreteProductA2
AbstractProductB <|-- ConcreteProductB1
AbstractProductB <|-- ConcreteProductB2
ConcreteFactory --> ConcreteProductA1 (创建)
ConcreteFactory --> ConcreteProductB1 (创建)
应用场景
  • 系统需要独立于产品创建方式
  • 需要确保产品兼容性
  • 产品家族需要一起使用
C++ 实现(UI 组件场景)
#include <iostream>
#include <memory>

/*
* 抽象工厂模式
* 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
* 基础组件:
* - AbstractFactory (抽象工厂):声明创建产品族的方法
* - ConcreteFactory (具体工厂):实现创建具体产品的方法
* - AbstractProductA/B (抽象产品):声明产品接口
* - ConcreteProductA/B (具体产品):实现特定产品
* 继承/实现关系:
* ConcreteFactory 实现 AbstractFactory,并创建具体产品实例。
* ConcreteProductA/B 实现 AbstractProductA/B 接口。
* ConcreteFactory 的方法返回具体产品实例。
*/

// 抽象按钮产品
class Button {
public:
    virtual void paint() = 0;
    virtual ~Button() = default;
};

// 抽象文本框产品
class TextBox {
public:
    virtual void draw() = 0;
    virtual ~TextBox() = default;
};

// 具体按钮产品:Windows 风格按钮
class WinButton : public Button {
public:
    void paint() override {
        std::cout << "Windows style button\n";
    }
};

// Mac 按钮
class MacButton : public Button {
public:
    void paint() override {
        std::cout << "macOS style button\n";
    }
};

// Windows 文本框
class WinTextBox : public TextBox {
public:
    void draw() override {
        std::cout << "Windows textbox\n";
    }
};

// Mac 文本框
class MacTextBox : public TextBox {
public:
    void draw() override {
        std::cout << "macOS textbox\n";
    }
};

// 抽象工厂
class GUIFactory {
public:
    virtual std::unique_ptr<Button> createButton() = 0;
    virtual std::unique_ptr<TextBox> createTextBox() = 0;
    virtual ~GUIFactory() = default;
};

// 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 AbstractFactoryPattern()
{
	std::cout << std::string(9, '-') << " Abstract Factory Pattern " << std::string(9, '-') << std::endl;
	std::unique_ptr<GUIFactory> factory = std::make_unique<MacFactory>();
	std::unique_ptr<Button> button = factory->createButton();
	std::unique_ptr<TextBox> textBox = factory->createTextBox();
	button->paint();
	textBox->draw();
}
组件对应关系
  • GUIFactory → 抽象工厂
  • WinFactory/MacFactory → 具体工厂
  • Button/TextBox → 抽象产品
  • WinButton/MacButton/WinTextBox/MacTextBox → 具体产品
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值