设计模式系列(11)抽象工厂模式
2017-06-13 15:12
351 查看
1.概念
抽象工厂模式是所有形态的工厂模式中最为抽象最为一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,能够创建多个产品族的产品对象。
备注:工厂模式要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能生产一个产品组。抽象工厂能够生产一个产品组。
解释:
具体工厂在开闭原则下,能生产香蕉或者苹果或者梨子(产品等级结构)
抽象工厂在开闭原则下,能生产南方香蕉或南方苹果或南方梨子(产品族)
北方香蕉或苹果或梨子
重要区别:
工厂模式只能生产一个产品。(要么香蕉,要么苹果)
抽象工厂可以生产一个产品族(里面有很多产品组成)
2.模式中包含的角色及其职责
1).抽象工厂(Creator)角色:抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
2).具体工厂(Concreter Creator)角色:具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品。
3).抽象(Product)角色:抽象模式所创建的所有对象的父类,它负责描述所有实例所有公共的接口。
4).具体产品(Concrete Product)角色:抽象模式所创建的具体实例对象。
抽象工厂UML类图
3.示例代码:
abstractfactory.h
main.cpp
抽象工厂模式是所有形态的工厂模式中最为抽象最为一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,能够创建多个产品族的产品对象。
备注:工厂模式要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能生产一个产品组。抽象工厂能够生产一个产品组。
解释:
具体工厂在开闭原则下,能生产香蕉或者苹果或者梨子(产品等级结构)
抽象工厂在开闭原则下,能生产南方香蕉或南方苹果或南方梨子(产品族)
北方香蕉或苹果或梨子
重要区别:
工厂模式只能生产一个产品。(要么香蕉,要么苹果)
抽象工厂可以生产一个产品族(里面有很多产品组成)
2.模式中包含的角色及其职责
1).抽象工厂(Creator)角色:抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
2).具体工厂(Concreter Creator)角色:具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品。
3).抽象(Product)角色:抽象模式所创建的所有对象的父类,它负责描述所有实例所有公共的接口。
4).具体产品(Concrete Product)角色:抽象模式所创建的具体实例对象。
抽象工厂UML类图
3.示例代码:
abstractfactory.h
#ifndef _ABSTRACTFACTORY_H_ #define _ABSTRACTFACTORY_H_ #include <iostream> using namespace std; class Fruit { public: virtual void SayName() = 0; }; class AbstractFactory { public: virtual Fruit* CreateBanana() = 0; virtual Fruit* CreateApple() = 0; }; class NorthBanana : public Fruit { public: virtual void SayName() { cout << "north banana" << endl; } }; class NorthApple : public Fruit { public: virtual void SayName() { cout << "north apple" << endl; } }; class SourthBanana : public Fruit { public: virtual void SayName() { cout << "Sourth banana" << endl; } }; class SourthApple : public Fruit { public: virtual void SayName() { cout << "Sourth apple" << endl; } }; class NorthFactory : public AbstractFactory { public: virtual Fruit* CreateBanana() { return new NorthBanana; } virtual Fruit* CreateApple() { return new NorthApple; } }; class SourthFactory : public AbstractFactory { public: virtual Fruit* CreateBanana() { return new SourthBanana; } virtual Fruit* CreateApple() { return new SourthApple; } }; #endif /*_ABSTRACTFACTORY_H_*/
main.cpp
#include <iostream> #include "abstractfactory.h" using namespace std; int main() { Fruit *fruit = NULL; AbstractFactory *af = NULL; af = new SourthFactory; fruit = af->CreateApple(); fruit->SayName(); delete fruit; fruit = af->CreateBanana(); fruit->SayName(); delete fruit; af = new NorthFactory; fruit = af->CreateApple(); fruit->SayName(); delete fruit; fruit = af->CreateBanana(); fruit->SayName(); delete fruit; delete af; delete fruit; return 0; }
相关文章推荐
- 设计模式系列一创建型之(抽象工厂模式)
- 设计模式系列之三:抽象工厂模式
- 设计模式系列(六)抽象工厂模式(Abstract Factory Pattern)
- 设计模式系列--工厂模式(简单工厂模式、抽象工厂模式)
- 设计模式系列(五)——抽象工厂模式
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 设计模式初学者系列-开篇以及抽象工厂模式
- 设计模式系列11---快速拷贝的原型模型
- 《React-Native系列》11、 图解RN布局之FlexBox,三分钟上手写RN界面
- VisualGDB系列11:Linux C++项目中使用外部Linux库
- 系列笔记11、观察者模式-ListView与Adapter
- MDT2012部署系列之11 WDS安装与配置
- 设计模式(11)---状态模式
- java进程性能分析步骤-超越昨天的自己系列(11)
- 11.抽象工厂模式
- Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件
- 【剑指offer系列】 数值的整数次方___11
- 设计模式系列-02-创建模式-简单工厂
- 解读ASP.NET 5 & MVC6系列(11):Routing路由