1.设计模式名称:抽象工厂(Abstract Factory)
概念
抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。该模式允许客户端使用具体工厂的实例来创建其需要的产品对象,同时使客户端不依赖于具体产品的实现。
意图
- 抽象化生产一系列相关或相互依赖的对象。
- 封装多个具体工厂类的公共接口。
- 支持配置应用程序的产品系列,而无需复杂的条件语句。
适用性
- 当一个系统需要独立于其产品的创建、组合和表示时。
- 当系统要被配置为一系列多个家族中的一个时。
- 当一组产品对象设计为一起使用,同时需要强调这种关系以便进行约束和简化管理时。
结构
抽象工厂模式通常涉及以下几个角色:
- AbstractFactory:提供一个接口,用于创建一系列相关或依赖对象。
- ConcreteFactory:实现 AbstractFactory 接口的类,每个类都能生成一系列具体产品。
- AbstractProduct:为一类产品对象声明一个接口。
- ConcreteProduct:实现 AbstractProduct 接口的具体类。eg:ProductA、ProductB
- Client:使用抽象工厂和产品接口来生成一系列产品。
实现代码示例
这里是一个简单的 C++ 实现,假设有两种产品族:Widget
和 Button
。每个产品族中有两种风格:Windows
和 Mac
。
#include <iostream>
// Abstract Products
class Widget {
public:
virtual void draw() = 0;
virtual ~Widget() {}
};
class Button : public Widget {
public:
void draw() override {
std::cout << "Drawing Button" << std::endl;
}
};
// Abstract Factory
class GUIFactory {
public:
virtual Widget *createButton() = 0;
virtual ~GUIFactory() {}
};
// Concrete Product
class WindowsButton : public Button {
public:
void draw() override {
std::cout << "Drawing Windows Button" << std::endl;
}
};
class MacButton : public Button {
public:
void draw() override {
std::cout << "Drawing Mac Button" << std::endl;
}
};
// Concrete Factories
class WindowsFactory : public GUIFactory {
public:
Widget *createButton() override {
return new WindowsButton();
}
};
class MacFactory : public GUIFactory {
public:
Widget *createButton() override {
return new MacButton();
}
};
// Client code
void drawGUI(GUIFactory *factory) {
Widget *widget = factory->createButton();
widget->draw();
delete widget;
}
int main() {
GUIFactory *winFactory = new WindowsFactory();
GUIFactory *macFactory = new MacFactory();
drawGUI(winFactory);
drawGUI(macFactory);
delete winFactory;
delete macFactory;
return 0;
}
输出
Drawing Windows Button
Drawing Mac Button
在这个例子中,GUIFactory
是抽象工厂,它有多个具体工厂(WindowsFactory
和 MacFactory
),分别生产各自风格的 Button
。客户端代码通过抽象工厂接口与具体产品交互,无需关心具体产品的类。这样做的好处是客户端代码可以面对产品家族的变化保持不变,增强系统的可配置性和扩展性。