设计模式 笔记 抽象工厂模式 Abstract Factory
//---------------------------15/04/09----------------------------
//Abstract Factory 抽象工厂----对象创建型模式
/*
1:意图:提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类。
2:别名:Kit
3:动机
4:适应性:
1>一个系统要独立于它的产品的创建、组合和表示时。
2>一个系统要由多个产品系列中的一个来配置时。
3>当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4>当你提供一个产品类库,而只想显示它们的接口而不是实现时。
5:结构:
AbstractFactory:<---------------------------------------------Client
CreateProductA() |
CreateProductB() |
| AbstractProductA<----------------
| | |
----------------- ----------- |
| | | | |
ConcreteFactory1: ConcreteFactor2:- - ->ProductA2 ProductA1<- - - |
CreateProductA() CreateProductA() | | |
CreateProductB() CreateProductB() | | |
| | AbstractProductB<---------------
| | | |
| | --------- |
| | | | |
| |- ->ProductB2 ProductB1<- - - |
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
6:参与者:
1>AbstractFactory:声明一个创建抽象产品对象的操作接口。
2>ConcreteFactory:实现创建具体产品对象的操作。
3>AbstractProduct:为一类产品对象声明一个接口。
4>ConcreteProduct:
1)定义一个将被响应的具体工厂创建的产品对象。
2)实现AbstractProduct接口。
5>Client:仅仅使用由AbstractFactory和AbstractProduct类声明的接口。
7:协作:
1>通常在运行时刻创建一个ConcreteFactory类的实例。这一具体的工厂创建具有
特定实现的产品对象。为创建不同的产品对象,客户应使用不同的具体工厂。
2>AbstractFactory将产品对象的创建延迟到他的ConcreteFactory子类。
8:效果:
1>优点:
1)它分离了具体的类:
AbstractFactory模式帮助控制一个应用创建的对象的类。
因为每一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过
抽象接口就可以操作实例对象,产品的类名耶在具体工厂的实现中被分离。
2)它使得易于交换产品系列:
当客户想要换一套产品系列使用时,只需要改变具体工厂即可
就是在初始化的时候改变使用的工厂,剩下的都无需改变,因为客户使用的是抽象工厂接口。
3)有利于产品的一致性:
当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一系列的对象。
AbstractFactory很容易就能实现。
2>缺点:
难以支持新种类的产品:
想要在一个产品系列中增加一种产品会很难,这样需要改变AbstractFactory的接口
其他子类也需要有所改变。
9:实现:
1>讲工厂作为单件:
一个应用中一般每个系列的产品只需要一个ConcreteFactory的实例。因此
工厂通常最好实现为一个Singleton。
2>创建产品:
AbstractFactory仅声明一个创建产品的接口,真正创建产品是由ConcreteProduct实现的
最常用的是每个产品定义一个工厂方法。一个工厂会为每个产品重定义该工厂指定的产品。
第二种方法是使用Prototype模式来实现,当系列有很多时,可以使用这种方法。
3>定义可扩展的工厂:
一种不安全的办法就是:创建产品的时候传入一个参数(标识),选择要创建的产品种类,然后返回一个
通用类型的指针(这样做不安全,而且需要所有产品种类有公共的基类,还要有同样的接口)。
10:代码实现: */
class MazeFactory
{
public:
MazeFactory();
virtual Maze* MakeMaze()
const
{return
new Maze;}
virtual Room* MakeRoom(int n)const
{return
new Room(n);}
virtual Wall* MakeWall()
const
{return
new Wall;}
virtual Door* MakeDoor(Room* r1, Room* r2)
const
{return
new Door(r1,r2);}
};
Maze* MazeGame::CreateMaze (MazeFactory& factory)
{
Maze* aMaze = factory.MakeMaze();
Room* r1 = factory.MakeRoom();
Room* r2 = factory.MakeRoom();
...
return aMaze;
}
//看看Bombed工厂
Wall* BombedMazeFactory::MakeWall()const
{
return
new BombedWall;
}
Room* BombedMazeFactory::MakeRoom(int n)const
{
return
new RoomWithABomb(n);
}
//只要在创建时换一个工厂就可以创建出不同的产品。
设计模式 笔记 抽象工厂模式 Abstract Factory的更多相关文章
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
- 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern
概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...
- 设计模式之抽象工厂模式(Abstract Factory Pattern)
一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...
- 学习笔记——抽象工厂模式Abstract Factory
在工厂模式的基础上,通过为工厂类增加接口,实现其他产品的生产,而不用一类产品就增加一个工厂. 依然以<真菌世界>游戏故事类比,树作为工厂,如果现在有两类树,一类生产快速弄真菌飞机和20毫米 ...
- .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)
概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释
抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...
- 抽象工厂模式(Abstract Factory)C#实例
抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...
随机推荐
- iis 发布asp.net mvc 网站时候js css 压缩问题,图片不加载问题
一.JS CSS 自动压缩问题 默认情况下mvc这个框架会把css,js文件压缩成一个js或者css文件,一会发现只有一个<link href="/Content/css?v=ji3n ...
- 【Redis数据库】再有人问你CAP理论是什么,就把这篇文章发给他
CAP是Consistency(一致性),Availability(可用性),Partition tolerance(分区容错性)的缩写.在学习redis过程中看到这个名词,查找各位大佬的文章发现这篇 ...
- ip 命令的使用
网上相似的资源很多,可以参考如下资料: man ip ip help 博客链接: https://linoxide.com/linux-command/use-ip-command-linux/ ht ...
- [Spark Core] Spark Client Job 提交三级调度框架
0. 说明 官方文档 Job Scheduling Spark 调度核心组件: DagScheduler TaskScheduler BackendScheduler 1. DagSchedule ...
- 巧用foxmail同步qq邮箱的通讯录
如果您企业使用的qq企业邮箱,那么你在web端登陆邮箱并填写收件人时,发现QQ邮箱是可以自动完成,并且中文名称自动完成. 如何在使用foxmail邮件客户端的情况下也同步这些邮箱信息呢?需要七步,看截 ...
- TIDB单机多实例进程
TIDB节点: TIKV节点(tidb服务也有放在这里也有) tidb进程 tikv进程 当使用单机多实例(就是一个机器多个tikv的存储节点)的时候,每个实例都有对应的一个进程,这个进程号就是我们在 ...
- spark-机器学习实践-K近邻应用实践一
K近邻应用-异常检测应用 原理: 根据数据样本进行KMeans机器学习模型的建立,获取簇心点,以簇为单位,离簇心最远的第五个点的距离为阈值,大于这个值的为异常点,即获得数据异常. 如图:
- windows系统显示隐藏文件以及显示文件扩展名
1.XP系统 打开“我的电脑”,“工具”,“文件夹选项” 勾选如下图 2.win7系统 打开“计算机”,“组织”,“文件夹和搜索选项” 勾选如下图 3.win10系统 打开“此电脑”,“查看”,勾选如 ...
- 以太坊预言机与WEB API(原创,转载请说明原址)
什么是预言机? 从链外获得数据,提供区块链与现实世界事件之间的连接,提供外部信息的平台 预言机自身也是一种智能合约,它允许区块链连接到任何现有的API 是这个预言机去调用各种 WEB API的接口 这 ...
- 【Ansible 文档】【译文】Windows 支持
see also:List of Windows Modules Windows Support Windows 支持 Windows: How Does It Work Windows:如何工作 正 ...