创建型模式-抽象工厂模式
1 什么是抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定具体的类。抽象工厂模式通过定义一个抽象工厂接口,该接口声明了一组用于创建不同类型对象的工厂方法。每个工厂方法负责创建一种类型的对象,而具体的工厂类则实现了这个接口,负责创建特定类型的对象。
抽象工厂模式适用于需要一次性创建一组相关对象的场景,这些对象之间存在一定的关联关系,且需要保证创建的对象是彼此兼容的。通过使用抽象工厂模式,可以避免客户端代码直接依赖具体类,从而实现了对象的解耦和灵活性。
2 举个例子
假设我们正在开发一个跨平台的界面库,它需要在不同的操作系统上创建相应的按钮和文本框。为了实现界面的跨平台性,我们可以使用抽象工厂模式。
首先,我们定义一个抽象的按钮接口 Button 和一个抽象的文本框接口 Textbox,它们分别声明了按钮和文本框的方法:
class Button {
public:
virtual void click() const = 0;
virtual ~Button() {}
};
class Textbox {
public:
virtual void input() const = 0;
virtual ~Textbox() {}
};
然后,我们定义一个抽象工厂接口 GUIFactory,其中包含了创建按钮和创建文本框的抽象工厂方法:
class GUIFactory {
public:
virtual Button* createButton() const = 0;
virtual Textbox* createTextbox() const = 0;
virtual ~GUIFactory() {}
};
接下来,我们创建两个具体的按钮类 WindowsButton 和 LinuxButton,它们分别实现了按钮接口:
class WindowsButton : public Button {
public:
void click() const override {
cout << "Windows button clicked." << endl;
}
};
class LinuxButton : public Button {
public:
void click() const override {
cout << "Linux button clicked." << endl;
}
};
然后,我们创建两个具体的文本框类 WindowsTextbox 和 LinuxTextbox,它们分别实现了文本框接口:
class WindowsTextbox : public Textbox {
public:
void input() const override {
cout << "Windows textbox input." << endl;
}
};
class LinuxTextbox : public Textbox {
public:
void input() const override {
cout << "Linux textbox input." << endl;
}
};
最后,我们创建具体的工厂类 WindowsFactory 和 LinuxFactory,它们分别实现了抽象工厂接口,负责创建相应的按钮和文本框对象:
class WindowsFactory : public GUIFactory {
public:
Button* createButton() const override {
return new WindowsButton();
}
Textbox* createTextbox() const override {
return new WindowsTextbox();
}
};
class LinuxFactory : public GUIFactory {
public:
Button* createButton() const override {
return new LinuxButton();
}
Textbox* createTextbox() const override {
return new LinuxTextbox();
}
};
在客户端代码中,我们可以根据当前操作系统选择对应的工厂类,并使用工厂类来创建相应的按钮和文本框对象:
int main() {
GUIFactory* factory = nullptr; // 根据当前操作系统选择工厂类
// 创建按钮和文本框
Button* button = factory->createButton();
Textbox* textbox = factory->createTextbox();
// 使用按钮和文本框
button->click();
textbox->input();
// 清理资源
delete button;
delete textbox;
delete factory;
return 0;
}
在上述示例中,我们定义了抽象的按钮接口 Button 和文本框接口 Textbox,以及抽象工厂接口 GUIFactory。通过具体的按钮类和文本框类,以及具体的工厂类 WindowsFactory 和 LinuxFactory,我们可以实现针对不同操作系统的按钮和文本框对象的创建。
3 总结
通过使用抽象工厂模式,我们可以在客户端代码中根据当前操作系统选择对应的工厂类,并通过该工厂类创建相应的按钮和文本框对象,而无需关心具体的类和操作系统细节,从而实现了对象的解耦和横向扩展的灵活性。
每一步踏出,都是一次探索,一次成长。