设计模式系列(11)抽象工厂模式
来源:互联网 发布:winebottler mac 下载 编辑:程序博客网 时间:2024/06/06 19:10
1.概念
北方香蕉或苹果或梨子
重要区别:
2.模式中包含的角色及其职责
1).抽象工厂(Creator)角色:抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
2).具体工厂(Concreter Creator)角色:具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品。
3).抽象(Product)角色:抽象模式所创建的所有对象的父类,它负责描述所有实例所有公共的接口。
抽象工厂模式是所有形态的工厂模式中最为抽象最为一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,能够创建多个产品族的产品对象。
备注:工厂模式要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能生产一个产品组。抽象工厂能够生产一个产品组。
解释:具体工厂在开闭原则下,能生产香蕉或者苹果或者梨子(产品等级结构)
抽象工厂在开闭原则下,能生产南方香蕉或南方苹果或南方梨子(产品族)北方香蕉或苹果或梨子
重要区别:
工厂模式只能生产一个产品。(要么香蕉,要么苹果)
抽象工厂可以生产一个产品族(里面有很多产品组成)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_*/
#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;}
阅读全文
0 0
- 设计模式系列(11)抽象工厂模式
- 【设计模式系列】--抽象工厂
- 设计模式之工厂模式系列(简单工厂,工厂模式,抽象工厂模式)
- 设计模式系列(七)简单工厂模式、工厂方法模式和抽象工厂模式对比
- 设计模式系列--工厂模式(简单工厂模式、抽象工厂模式)
- 设计模式系列4-抽象工厂模式
- JAVA系列-设计模式-抽象工厂模式
- 炒冷饭系列:设计模式 抽象工厂模式
- 设计模式系列--抽象工厂模式
- 设计模式系列:抽象工厂模式
- 设计模式系列之抽象工厂模式
- 设计模式系列--抽象工厂模式
- 设计模式系列课程11之【抽象工厂模式】
- 设计模式问答系列(3)----抽象工厂模式
- php设计模式学习系列(四)--抽象工厂模式
- 设计模式系列(五)——抽象工厂模式
- PHP设计模式系列(十):抽象工厂模式
- Java/Android 设计模式系列(4)--抽象工厂模式
- selenium3.4 在不确定页面上某类web元素的数量的情况下,遍历元素
- 关于解决难倒一大片祖国花骨朵的caffe安装 error MSB4062 加载任务“NuGetPackageOverlay”失败问题
- svm核函数的理解和选择
- 给初学者的RxJava2.0教程(九)
- 使用了JDK自带的jconsole查看Tomcat运行情况
- 设计模式系列(11)抽象工厂模式
- 《算法概论》习题8.19证明
- mysql如何随机获取数据的方法
- Flot Pie Examples
- qcustomplot.h中double minDistSqr = (std::numeric_limits<double>::max)()这一句报错
- bash基本功能之别名(alias)
- 如何利用缺陷的管理提高软件开发质量五——缺陷预测
- java 掩码2
- UI框架