Abstract Factory - 抽象工厂模式

来源:互联网 发布:生意参谋数据分析 编辑:程序博客网 时间:2024/05/16 10:06
定义
​提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。

目的
​抽象工厂模式针对的是多个抽象产品等级结构,而每一个抽象产品有多余一个的具体子类。比如要设计一款图形设计软件,要求它可以在不同的平台上运行,由于不同的平台界面风格有所不同,这时候就需要提供一个抽象的工厂类WidgetFactory,它提供了创建各种控件所需要的方法。对于不同的平台,需要创建不同的子类,比如WindowsWidgetFactory,MacWidgetFactory。当需要创建控件的时候,每一个控件也是一个抽象工厂体系。


实现
IButton.h
  1. class IButton {
  2. protected:
  3. virtual void paintEvent() = 0;
  4. };
WindowsButton.h
  1. #include "IButton.h"
  2. class WindowsButton : public IButton {
  3. protected:
  4. void paintEvent() { ... }
  5. };
MacButton.h
  1. #include "IButton.h"
  2. class MacButton : public IButton {
  3. protected:
  4. void paintEvent() { ... }
  5. };

IMenu.h
  1. class IMenu {
  2. protected:
  3. virutal void paintEvent() = 0;
  4. };
WindowsMenu.h
  1. #include "IMenu.h"
  2. class WindowsMenu : public IMenu {
  3. protected:
  4. void paintEvent() { ... }
  5. };
MacMenu.h
  1. #include "IMenu.h"
  2. class MacMenu : public IMenu {
  3. protected:
  4. void paintEvent() { ... }
  5. };
WidgetFactory.h
  1. class IButton;
  2. class IMenu;
  3. class WidgetFactory {
  4. public:
  5. virtual IButton* createButton() = 0;
  6. virtual IMenu* createMenu() = 0;
  7. };
WindowsWidgetFactory.h
  1. #include "WindowsButton.h"
  2. #include "WindowsMenu.h"
  3. #include "WidgetFactory.h"
  4. class WindowsWidgetFactory : public WidgetFactory {
  5. public:
  6. virtual IButton* createButton() { return new WindowsButton(); };
  7. virtual IMenu* createMenu() { return new WindowsMenu(); };
  8. };
MacWidgetFactory.h
  1. #include "MacButton.h"
  2. #include "MacMenu.h"
  3. #include "WidgetFactory.h"
  4. class MacWidgetFactory : public WidgetFactory {
  5. public:
  6. virtual IButton* createButton() { return new MacButton(); };
  7. virtual IMenu* createMenu() { return new MacMenu(); };
  8. };
main.cpp
  1. #include "WindowsWidgetFactory.h"
  2. #include "MacWidgetFactory.h"
  3. int main()
  4. {
  5. Application app;
  6. WidgetFactory* factory = NULL;
  7. #ifdef OS_MAC
  8. factory = new MacWidgetFactory();
  9. #else
  10. factory = new WindowWidgetFactory();
  11. #endif
  12. factory->createMenu();
  13. factory->createButton();
  14. return app.exec();
  15. }

适用性
  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要由多个产品系类中的一个来配置时。
  • 当提供了一系列相关的产品对象,进行联合使用时。
  • 当提供了一个产品类库,只是想提供接口而不是实现时。
优缺点
  1. ​分离了具体的类 : 一个工厂封装了创建产品的责任和过程,客户通过它的抽象接口操作实例。
  2. 易于交换产品系类 : 一个具体的工厂类在一个应用中只出现一次,即初始化的时候,这使得改变一个应用的具体工厂变得容易。
  3. 有利于产品的一致性 : 当一些列的产品设计成在一起工作时,一个应用一次只能创建一个系列的产品。
  4. 难以支持新的产品 : 当要扩充新产品的时候,扩充接口,会使得抽象工厂类和它的所有子类都要修改。
相关模式
工厂方法模式:一个抽象工厂类派生多个具体工厂类,一个抽象产品类派生多个具体产品类。每个具体工厂只能创建一个具体产品类实例。比如只能有个控件产品类Menu,子类WindowMenu和MacMenu,WindowsWidgetFactory只能创建WindowMenu,MacWidgetFactory只能创建MacMenu。
抽象工厂模式:一个抽象工厂类派生多个具体工厂类。多个抽象产品类派生多个具体产品类。每个具体工厂能创建多个具体产品类实例。可以同时拥有多个控件产品类,WindowsWidgetFactory可以创建WindowMenu和WindowButton,MacWidgetFactory可以创建MacMenu和MacButton。

0 0
原创粉丝点击