//---------------------------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的更多相关文章

  1. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  2. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  3. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  4. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  5. 设计模式之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...

  6. 学习笔记——抽象工厂模式Abstract Factory

    在工厂模式的基础上,通过为工厂类增加接口,实现其他产品的生产,而不用一类产品就增加一个工厂. 依然以<真菌世界>游戏故事类比,树作为工厂,如果现在有两类树,一类生产快速弄真菌飞机和20毫米 ...

  7. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  8. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  9. 抽象工厂模式(Abstract Factory)C#实例

    抽象工厂模式(Abstract Factory)C#实例 本文出处http://www.dofactory.com/net/abstract-factory-design-pattern 一.场景描述 ...

随机推荐

  1. leveldb源码分析--SSTable之TableBuilder

    上一篇文章讲述了SSTable的格式以后,本文结合源码解析SSTable是如何生成的. void TableBuilder::Add(const Slice& key, const Slice ...

  2. 使用 PowerShell 将数据磁盘附加到 Windows VM

    本文介绍如何使用 PowerShell 将新磁盘和现有磁盘附加到 Windows 虚拟机. 在开始之前,请查看以下提示: 虚拟机的大小决定了可以附加多少个磁盘. 有关详细信息,请参阅虚拟机大小. 若要 ...

  3. 谨慎使用MyBatis自动生成Where语句

    最近监控到类似这样一个慢查询: select XX_time from XXOrderInfo WHERE ( OrderId is not null and OrderId = N'xxxx') x ...

  4. CSS| 解决子级用css float浮动 而父级div没高度不能自适应高度

    解决子级用css float浮动 而父级div没高度不能自适应高度 解决子级对象使用css float浮动 而父级div不能自适应高度,不能被父级内容撑开解决方法,父级div没有高度解决方法. 最外层 ...

  5. history历史记录控制

    往往我们操作的每一条命令都会被机器记录下来,所有我们为了安全需要屏蔽掉某些敏感的操作命令. 设置linux默认的历史记录数: 临时生效: export  HISTSIZE=5 history 永久生效 ...

  6. django —— 邮件

    官方文档 1.11 配置settings.py # QQ邮箱为例, 其他邮箱对应的SMTP配置可查官方 EMAIL_HOST = "smtp.qq.com" EMAIL_PORT ...

  7. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

  8. Redis缓存雪崩、缓存穿透、热点Key解决方案和分析

    缓存穿透 缓存系统,按照KEY去查询VALUE,当KEY对应的VALUE一定不存在的时候并对KEY并发请求量很大的时候,就会对后端造成很大的压力. (查询一个必然不存在的数据.比如文章表,查询一个不存 ...

  9. Linux运维之批量下载指定网站的100个图片文件,并找出大于200KB的文件

    题目为:  有一百个图片文件,它们的地址都是http://down.fengge.com/img/1.pnghttp://down.fengge.com/img/2.png…一直到http://dow ...

  10. LAMP平台的搭建及应用

    实验要求 1.构建PHP运行环境,实现LAMP协同架构,前提条件是服务器中已经编译好了Apache HTTP Server和MySQL数据库,(编译安装apache和编译安装mysql 请查看公众号L ...