Abstract Factory - 抽象工厂模式
来源:互联网 发布:生意参谋数据分析 编辑:程序博客网 时间:2024/05/16 10:06
定义
提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。
目的
抽象工厂模式针对的是多个抽象产品等级结构,而每一个抽象产品有多余一个的具体子类。比如要设计一款图形设计软件,要求它可以在不同的平台上运行,由于不同的平台界面风格有所不同,这时候就需要提供一个抽象的工厂类WidgetFactory,它提供了创建各种控件所需要的方法。对于不同的平台,需要创建不同的子类,比如WindowsWidgetFactory,MacWidgetFactory。当需要创建控件的时候,每一个控件也是一个抽象工厂体系。
实现
IButton.h
class IButton {
protected:
virtual void paintEvent() = 0;
};
WindowsButton.h
#include "IButton.h"
class WindowsButton : public IButton {
protected:
void paintEvent() { ... }
};
MacButton.h
#include "IButton.h"
class MacButton : public IButton {
protected:
void paintEvent() { ... }
};
IMenu.h
class IMenu {
protected:
virutal void paintEvent() = 0;
};
WindowsMenu.h
#include "IMenu.h"
class WindowsMenu : public IMenu {
protected:
void paintEvent() { ... }
};
MacMenu.h
#include "IMenu.h"
class MacMenu : public IMenu {
protected:
void paintEvent() { ... }
};
WidgetFactory.h
class IButton;
class IMenu;
class WidgetFactory {
public:
virtual IButton* createButton() = 0;
virtual IMenu* createMenu() = 0;
};
WindowsWidgetFactory.h
#include "WindowsButton.h"
#include "WindowsMenu.h"
#include "WidgetFactory.h"
class WindowsWidgetFactory : public WidgetFactory {
public:
virtual IButton* createButton() { return new WindowsButton(); };
virtual IMenu* createMenu() { return new WindowsMenu(); };
};
MacWidgetFactory.h
#include "MacButton.h"
#include "MacMenu.h"
#include "WidgetFactory.h"
class MacWidgetFactory : public WidgetFactory {
public:
virtual IButton* createButton() { return new MacButton(); };
virtual IMenu* createMenu() { return new MacMenu(); };
};
main.cpp
#include "WindowsWidgetFactory.h"
#include "MacWidgetFactory.h"
int main()
{
Application app;
WidgetFactory* factory = NULL;
#ifdef OS_MAC
factory = new MacWidgetFactory();
#else
factory = new WindowWidgetFactory();
#endif
factory->createMenu();
factory->createButton();
return app.exec();
}
适用性
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系类中的一个来配置时。
- 当提供了一系列相关的产品对象,进行联合使用时。
- 当提供了一个产品类库,只是想提供接口而不是实现时。
优缺点
- 分离了具体的类 : 一个工厂封装了创建产品的责任和过程,客户通过它的抽象接口操作实例。
- 易于交换产品系类 : 一个具体的工厂类在一个应用中只出现一次,即初始化的时候,这使得改变一个应用的具体工厂变得容易。
- 有利于产品的一致性 : 当一些列的产品设计成在一起工作时,一个应用一次只能创建一个系列的产品。
- 难以支持新的产品 : 当要扩充新产品的时候,扩充接口,会使得抽象工厂类和它的所有子类都要修改。
相关模式
工厂方法模式:一个抽象工厂类派生多个具体工厂类,一个抽象产品类派生多个具体产品类。每个具体工厂只能创建一个具体产品类实例。比如只能有个控件产品类Menu,子类WindowMenu和MacMenu,WindowsWidgetFactory只能创建WindowMenu,MacWidgetFactory只能创建MacMenu。
抽象工厂模式:一个抽象工厂类派生多个具体工厂类。多个抽象产品类派生多个具体产品类。每个具体工厂能创建多个具体产品类实例。可以同时拥有多个控件产品类,WindowsWidgetFactory可以创建WindowMenu和WindowButton,MacWidgetFactory可以创建MacMenu和MacButton。
0 0
- 抽象工厂模式(Abstract Factory)
- Abstract Factory(抽象工厂模式)
- Abstract Factory抽象工厂模式
- 抽象工厂(Abstract Factory)模式
- Abstract Factory 抽象工厂模式
- Abstract Factory 抽象工厂模式
- 抽象工厂(Abstract Factory)模式
- 抽象工厂模式(Abstract Factory)
- 抽象工厂模式(Abstract Factory)
- 抽象工厂模式(Abstract Factory)
- Abstract Factory 抽象工厂模式
- 抽象工厂模式(Abstract Factory)
- 抽象工厂模式(Abstract Factory)
- 抽象工厂模式(Abstract Factory)
- 抽象工厂模式(Abstract Factory)
- 抽象工厂模式(Abstract Factory)
- 抽象工厂模式 - Abstract Factory
- Abstract Factory 抽象工厂模式
- Java 流
- php模块memcache和memcached区别分析
- hdu 1733 最大流sap
- 判断A树是否包含B树结构
- 利用观察者模式在view和ControllerView之间传值
- Abstract Factory - 抽象工厂模式
- 我的心情
- UIPageControl与UIScrollView的结合使用
- 高效使用hive
- 字节数组流
- UVA 705 Slash Maze
- 一个完整的项目管理流程
- ReportStudio入门教程(五十五) - 对每个月份进行排名
- 动态规划:从新手到专家