设计模式 -- 抽象工厂模式 AbstractFactory
2013-10-28 16:30
429 查看
抽象工厂模式:算是三大工厂模式中最难理解的一个了,上次校招笔试考过,但是稀里糊涂写成了简单工厂了T_T
首先看一个问题场景:
问题场景:系统里有三个组件a、b、c同时使用,但是a的同类a1、a2和a有相通的地方但是互斥,b和c也一样。一个例子就是windows和linux都有图形窗口Text和Button对象,分别是winText、winButton和linuxText、linuxButton,而winText和winButton必须在系统windows下使用,但是winButton和linuxButton又有共同点,按下后会出发事件等等。
解决方案:抽象工厂模式
如何选用winButton或者winText,由具体工厂类winFactory负责,有选择合适的产品对象的逻辑,与应用系统的商业逻辑相关
抽象工厂类负责定义接口,是整个抽象工厂的核心,IFactory
winButton和linuxButton是一种产品族,有共同的特点,特点由抽象产品类接口定义Button,具体的实现由具体的产品类负责
在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。例如这里的Button和Text就是两个不同的产品族。
抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式
看结构图:
来一段例子程序:
注意:以上代码引用了C++11的shared_ptr,所以编译时候注意编译器有无启用C++最新标准。
另外,大话设计模式中的一个例子非常好
系统基于不同的数据库产品,访问数据,结构图如下:
最后和工厂方法比较下:
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
和工厂方法区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
首先看一个问题场景:
问题场景:系统里有三个组件a、b、c同时使用,但是a的同类a1、a2和a有相通的地方但是互斥,b和c也一样。一个例子就是windows和linux都有图形窗口Text和Button对象,分别是winText、winButton和linuxText、linuxButton,而winText和winButton必须在系统windows下使用,但是winButton和linuxButton又有共同点,按下后会出发事件等等。
解决方案:抽象工厂模式
如何选用winButton或者winText,由具体工厂类winFactory负责,有选择合适的产品对象的逻辑,与应用系统的商业逻辑相关
抽象工厂类负责定义接口,是整个抽象工厂的核心,IFactory
winButton和linuxButton是一种产品族,有共同的特点,特点由抽象产品类接口定义Button,具体的实现由具体的产品类负责
在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。例如这里的Button和Text就是两个不同的产品族。
抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式
看结构图:
来一段例子程序:
#include <iostream> #include <memory> using namespace std; //抽象工厂模式 -- 创建不同风格的对话框:windows or Mac //抽象产品:IButton class IButton { public: virtual void draw() = 0; }; //具体产品:WindowsButton class WindowsButton : public IButton { public: void draw() { cout << "draw Windows Button" << endl; } }; //具体产品:MacButton class MacButton : public IButton { public: void draw() { cout << "draw Mac Button" << endl; } }; //抽象产品:ITextBox class ITextBox { public: virtual void draw() = 0; }; //具体产品:WindowsButton class WindowsTextBox : public ITextBox { public: void draw() { cout << "draw Windows TextBox" << endl; } }; //具体产品:MacButton class MacTextBox : public ITextBox { public: void draw() { cout << "draw Mac TextBox" << endl; } }; //抽象工厂:IFactory class IFactory { public: virtual shared_ptr<IButton> createButton() = 0; virtual shared_ptr<ITextBox> createTextBox() = 0; }; //具体的工厂:WindowsFactory class WindowsFactory : public IFactory { public: shared_ptr<IButton> createButton() { return shared_ptr<IButton>(new WindowsButton()); } shared_ptr<ITextBox> createTextBox() { return shared_ptr<ITextBox>(new WindowsTextBox()); } }; //具体的工厂:MacFactory class MacFactory : public IFactory { public: shared_ptr<IButton> createButton() { return shared_ptr<IButton>(new MacButton()); } shared_ptr<ITextBox> createTextBox() { return shared_ptr<ITextBox>(new MacTextBox());} }; int main() { shared_ptr<IFactory> pIFactory(new MacFactory()); shared_ptr<IButton> pButton(pIFactory->createButton()); shared_ptr<ITextBox> pTextBox(pIFactory->createTextBox()); pButton->draw(); //draw Mac Button pTextBox->draw(); //draw Mac TextBox return 0; }
注意:以上代码引用了C++11的shared_ptr,所以编译时候注意编译器有无启用C++最新标准。
另外,大话设计模式中的一个例子非常好
系统基于不同的数据库产品,访问数据,结构图如下:
最后和工厂方法比较下:
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
和工厂方法区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
相关文章推荐
- 初学设计模式【6】抽象工厂模式——AbstractFactory
- C++设计模式的AbstractFactory(抽象工厂模式)图解
- C++设计模式-AbstractFactory抽象工厂模式
- [设计模式]AbstractFactory抽象工厂模式
- 设计模式 (三)抽象工厂模式(AbstractFactory)
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 设计模式之抽象工厂模式(AbstractFactory)
- 设计模式——抽象工厂模式AbstractFactory
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 【设计模式】-抽象工厂模式-AbstractFactory
- C++设计模式-AbstractFactory抽象工厂模式
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 我的设计模式之旅(3)——抽象工厂模式AbstractFactory
- 【2】设计模式之抽象工厂模式(AbstractFactory)
- 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型
- C++设计模式-AbstractFactory抽象工厂模式
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 我的设计模式之旅(3)――抽象工厂模式AbstractFactory
- 面向对象的设计模式系列之三:抽象工厂模式(AbstractFactory)