对象创建型模式------Abstract Factory(抽象工厂)
1. 意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2. 别名
Kit
3. 动机
假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大 (让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单 (没有挑战性也不符合玩家的心理)。于是我们就可以采用这样一种处理策略:为游戏设立等级,初级、中级、高级甚至有BT 级。假设也是过关的游戏,每个关卡都有一些怪物 (monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡,我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。可以想象在这个系统中,将会有成千上万的怪物实例要创建,问题是还要保证创建的时候不会出错:初级不能创建 BT 级的怪物(玩家就郁闷了,玩家一郁闷,游戏也就挂挂了),反之也不可以。
AbstractFactory 模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象。
②一个系统要由多个产品系列中的一个来配置时。
③当你要强调一系列相关的产品对象的设计以便进行联合使用时。
④当你提供一个产品类库,而只想显示它们的接口而不是实现时。
②Concreteactory(MotifWidgetFactory,PMWidgetFactory):实现创建具体产品对象的操作。
③AbstractProduct(Windows,ScrollBar):为一类产品对象声明一个接口。
④ConcreteProduct(MotifWindow,MotifScrollBar):定义一个将被相应的具体工厂创建的产品对象;实现AbstractProduct接口。
⑤Client:仅使用由AbstractFactory和AbstractProduct类声明的接口。
#include<iostream>
class AbstractProductA{
public:
virtual ~ AbstractProductA(){}
protected:
AbstractProductA(){}
};
class AbstractProductB{
public:
virtual ~ AbstractProductB(){}
protected:
AbstractProductB(){}
};
class ProductA1:public AbstractProductA{
public:
ProductA1(){std::cout<< "ProductA1..."<<std::endl;}
};
class ProductA2:public AbstractProductA{
public:
ProductA2(){std::cout<< "ProductA2..."<<std::endl;}
};
class ProductB1:public AbstractProductB{
public:
ProductB1(){std::cout<< "ProductB1..."<<std::endl;}
};
class ProductB2:public AbstractProductB{
public:
ProductB2(){std::cout<< "ProductB2..."<<std::endl;}
};
class AbstractFactory{
public:
virtual ~AbstractFactory(){}
virtual AbstractProductA* CreateProductA()=;
virtual AbstractProductB* CreateProductB()=;
protected:
AbstractFactory(){}
};
class ConcreteFactory1:public AbstractFactory{
public:
AbstractProductA* CreateProductA(){ return new ProductA1();}
AbstractProductB* CreateProductB(){ return new ProductB1();}
};
class ConcreteFactory2:public AbstractFactory{
public:
AbstractProductA* CreateProductA(){ return new ProductA2();}
AbstractProductB* CreateProductB(){ return new ProductB2();}
};
int main(){
AbstractFactory * cf1 = new ConcreteFactory1();
cf1->CreateProductA();
cf1->CreateProductB();
AbstractFactory * cf2 = new ConcreteFactory2();
cf2->CreateProductA();
cf2->CreateProductB();
}

对象创建型模式------Abstract Factory(抽象工厂)的更多相关文章
- 设计模式(3)-对象创建型模式-Abstract Factory模式
1.对象创建型模式 1.3 Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: • 一个系统要独立于它的产品的创建. ...
- 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)
意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...
- 创建型模式——Abstract Factory
1.意图 提供一个创建一系列相关或相互依赖的接口,而无需指定它们具体的类. 2.结构 3.参与者 AbstractFactory声明一个创建抽象产品对象的操作接口 ConcreteFactory实现创 ...
- 设计模式02: Abstract Factory 抽象工厂(创建型模式)
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题: -实现依赖 ...
- 设计模式(4)-对象创建型模式-Prototype模式
1.对象创建型模式 1.4 Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...
- 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式
1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...
- Abstract Factory抽象工厂模式
抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...
- 【创建型】Abstract Factory模式 & Factory Method模式
本文主要介绍简单工厂模式与抽象工厂模式.以下如有叙述不当之处,欢迎批评指正,欢迎交流探讨. 一:简单工厂模式 在23种设计模式中,简单工厂模式其实是不在列的,但理解该模式对于抽象工厂模式的思想理解是有 ...
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
随机推荐
- Spring MVC返回JSON数据
将一个对象以json数据格式返回前台: @ResponseBody public User login(User user) { return user; } 在控制器上使用@ResponseBod ...
- msp430的两本书 电子版【worldsing笔记】
msp430的两本书,pdf版 MSP430系列单片机接口_技术及系统设计实例 MSP430系列16位超低功耗单片机原理与应用 点击此处下载 ourdev_528863.pdf(文件大小:4.21M) ...
- MSSQLSERVER数据库- SP_EXECUTESQL的使用
EXEC和SP_EXECUTESQL有什么区别呢? 1,它们之间最大的区别是嵌入式的参数,如下面一个语句 declare @sql nvarchar() declare @id varchar() ' ...
- RocketMQ入门(2)最佳实践
转自:http://www.changeself.net/archives/rocketmq入门(2)最佳实践.html RocketMQ入门(2)最佳实践 一.服务端安装部署 我是在虚拟机中的Cen ...
- Android进阶之大话设计模式
一般来说,常用的设计模式有以下八种:单例.工厂.观察者.代理.命令.适配器.合成.访问者 单例模式:目的是为了让系统中只有一个调用对象,缺点是单例使其他程序过分依赖它,而且不同单例运行在不同进程中,使 ...
- 教你50招提升ASP.NET性能(十二):在生产环境,仔细考虑你需要记录哪些日志
(18)When in production, carefully consider what you need to log 招数18: 在生产环境,仔细考虑你需要记录哪些日志 Many peopl ...
- iOS调用系统通讯录获取姓名电话号码(转)
原文地址:http://blog.csdn.net/idoshi201109/article/details/46007125 OS调用系统通讯录获取姓名电话号码 (iOS 8.0 Xcode6.3可 ...
- There is no Action mapped for namespace [/pages/action/student] and action name [findStudent]
1.错误描写叙述 2014-7-13 2:38:54 org.apache.jasper.compiler.TldLocationsCache tldScanJar 信息: At least one ...
- android 基站定位
package cn.LocationStation; import java.io.BufferedReader; import java.io.InputStream; import java.i ...
- java_jdbc_基本连接池
MyDataSource实现封装连接池,MyConnection实现connection类,通过代理模式相互调用 package cn.itcast; import java.sql.*; publi ...