定义
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这个模式通过定义一个接口来创建相关的对象,客户端通过该接口访问具体工厂类的实例,从而实现对象的创建。
结构
-
抽象工厂(AbstractFactory) :声明创建一组相关对象的方法。
-
具体工厂(ConcreteFactory) :实现创建具体产品的方法。
-
抽象产品(AbstractProduct) :为每种产品声明一个接口。
-
具体产品(ConcreteProduct) :实现抽象产品接口的具体类。
-
客户端(Client) :通过抽象工厂接口使用具体工厂类来创建产品。
代码示例
假设有两种风格的 UI 组件: Windows 风格和 Mac 风格。使用抽象工厂模式来创建这两种风格的按钮和文本框。
#include <iostream>
// 抽象产品A类:按钮
class Button
{
public:
virtual void paint() = 0;
};
// 抽象产品B类:文本框
class TextBox
{
public:
virtual void paint() = 0;
};
// 具体产品A1类:Windows风格的按钮
class WindowsButton : public Button
{
public:
void paint() override
{
std::cout << "Render a button in Windows style." << std::endl;
}
};
// 具体产品A2类:Mac风格的按钮
class MacButton : public Button
{
public:
void paint() override
{
std::cout << "Render a button in Mac style." << std::endl;
}
};
// 具体产品B1类:Windows风格的文本框
class WindowsTextBox : public TextBox
{
public:
void paint() override
{
std::cout << "Render a text box in Windows style." << std::endl;
}
};
// 具体产品B2类:Mac风格的文本框
class MacTextBox : public TextBox
{
public:
void paint() override
{
std::cout << "Render a text box in Mac style." << std::endl;
}
};
// 抽象工厂类
class GUIFactory
{
public:
virtual Button* createButton() = 0;
virtual TextBox* createTextBox() = 0;
};
// 具体工厂1类:Windows工厂
class WindowsFactory :public GUIFactory
{
public:
Button* createButton() override
{
return new WindowsButton();
}
TextBox* createTextBox() override
{
return new WindowsTextBox();
}
};
// 具体工厂2类:Mac工厂
class Macfactory : public GUIFactory
{
public:
Button* createButton() override
{
return new MacButton();
}
TextBox* createTextBox() override
{
return new MacTextBox();
}
};
// 客户端
class Application
{
private:
GUIFactory* factory;
Button* button;
TextBox* textbox;
public:
Application(GUIFactory* factory) : factory(factory)
{
button = factory->createButton();
textbox = factory->createTextBox();
}
void paint()
{
button->paint();
textbox->paint();
}
~Application()
{
delete button;
delete textbox;
}
};
int main()
{
GUIFactory* winFactory = new WindowsFactory();
Application winApp(winFactory);
winApp.paint();
delete winFactory;
GUIFactory* macFactory = new Macfactory();
Application macApp(macFactory);
macApp.paint();
delete macFactory;
system("pause");
return 0;
}
总结
抽象工厂模式通过定义一个接口来创建一组相关或相互依赖的对象,从而实现产品的系列化创建。这种模式在需要创建一系列相关对象的场景中非常有用,可以有效地管理和扩展产品族。同时,抽象工厂模式使得客户端代码与具体产品的实现解耦,提高了系统的灵活性和可扩展性。