设计模式---抽象工厂模式

102 阅读2分钟

定义

抽象工厂模式(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;
}

总结

抽象工厂模式通过定义一个接口来创建一组相关或相互依赖的对象,从而实现产品的系列化创建。这种模式在需要创建一系列相关对象的场景中非常有用,可以有效地管理和扩展产品族。同时,抽象工厂模式使得客户端代码与具体产品的实现解耦,提高了系统的灵活性和可扩展性。