工厂模式(正式)

发布时间 2023-09-24 14:52:20作者: 游客0721

抽象工厂模式及示例

模式的动机

  1. 提供一种接口,用于创建一系列相关或相互依赖的对象

  2. 抽象工厂模式通过引入抽象工厂接口,允许客户端代码通过工厂接口创建产品,而不需要关心具体的产品类;

  3. 使得客户端代码可以与特定产品的具体类解耦,实现了抽象和实现的分离

模式的实现

  1. 抽象的工厂和抽象的类,扩展的整体风格
  2. 抽象工厂模式的实现,一系列有相互依赖相互作用的对象组合的生成
  3. 抽象工厂模式的缺点是难以应对”新对象”的需求变动

我们设想这样一个情景:

  • 考虑两个平台:Windows 和 MAC
  • 有两个ui组件:
  • PushButton : click, close;
  • MainWindow : show, close;
  • QT在UI控件中创建按钮对象,实际上这个按钮需要继承自很多基类,但是对于用户来说可能就是一行代码的事,实现了抽象与具体需求实现的分离
class PushButton
{
public:
	//
	virtual void Click() = 0;
	virtual void Close() = 0;
};

class MainWindow
{
public:
	virtual void Show() = 0;
	virtual void Close() = 0;
};

class GUIFactory 
{
public:
	virtual  shared_ptr<PushButton> CreateButton() = 0;
	virtual shared_ptr<MainWindow>  CreateWindow() = 0;
};

这里定义了三个抽象类,PushButton 和 MainWindow 是 GUI 元素,GUIFactory 是用于创建这些元素的抽象工厂。
下面我们实现一下Windows下的实现:

#pragma once
#include "UI.h"
#include <iostream>
using namespace std;

class WindowsButton: public PushButton
{
public:
	virtual void Click()
	{
		cout << "WindowsButton::Click" << endl;
	}
	virtual void Close()
	{
		cout << "WindowsButton::Close" << endl;
	}
};

class WindowsWindow:public MainWindow
{
public:
	virtual void Show()
	{
		cout << "WindowsWindow::Show" << endl;
	}
	virtual void Close()
	{
		cout << "WindowsWindow::Close" << endl;
	}
};

class WindowsFactory: public GUIFactory
{
public:
	virtual  shared_ptr<PushButton> CreateButton()
	{
		return make_shared<WindowsButton>();
	}
	virtual shared_ptr<MainWindow>  CreateWindow()
	{
		return make_shared<WindowsWindow>();
	}
};

上面就是一个Windows风格的实现,实际上,我们在按照上面Windows的方式扩充了Mac OS和Linux风格的实现之后,我们可以按照下面的方式在main函数中如何使用。