抽象工厂模式及示例
模式的动机
-
提供一种接口,用于创建一系列相关或相互依赖的对象
-
抽象工厂模式通过引入抽象工厂接口,允许客户端代码通过工厂接口创建产品,而不需要关心具体的产品类;
-
使得客户端代码可以与特定产品的具体类解耦,实现了抽象和实现的分离
模式的实现
- 抽象的工厂和抽象的类,扩展的整体风格
- 抽象工厂模式的实现,一系列有相互依赖相互作用的对象组合的生成
- 抽象工厂模式的缺点是难以应对”新对象”的需求变动
我们设想这样一个情景:
- 考虑两个平台: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函数中如何使用。
标签:正式,void,virtual,工厂,抽象,模式,shared,public From: https://www.cnblogs.com/Gal0721/p/17725983.html