设计模式可复用面向对象软件的基础 第3章 创建型模式(4)

2021-09-24 20:27

个从文件中读取迷宫说明图并建造相应迷宫的程序。或者它可以被用于一个随机建造迷宫的程序。建造迷宫的程序将 M a z e F a c t o r y作为一个参数,这样程序员就能指定要创建的房间、墙壁和门等类。

回想一下建立一个由两个房间和它们之间的门组成的小迷宫的成员函数 C r e a t e M a z e。 C r e a

t e M a z e对类名进行硬编码,

这使得很难用不同的组件创

建迷宫。

这里是一个以M a z e F a c t

o r y为参数的新版本的

CreateMaze ,它修改了以上

缺点:

我们创建M a z e F a c t o r y

的子类E n c h a n t e d M a z e F a c t o r y,这是一个创建施了魔法的迷宫的工厂。E n c h a n t e d M a z e F a c t o r y将重定义不同的成员函数并返回 R o o m,Wa l l等不同的子类。

本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用

现在假设我们想生成一个迷宫游戏,在这个游戏里,每个房间中可以有一个炸弹。如果这个炸弹爆炸,它将(至少)毁坏墙壁。我们可以生成一个 R o o m的子类以明了是否有一个炸弹在房间中以及该炸弹是否爆炸了。我们也将需要一个 Wa l l的子类以明了对墙壁的损坏。我们将称这些类为R o o m Wi t h A B o m b和B o m b e d Wa l l。

我们将定义的最后一个类是 B o m b e d M a z e F a c t o r y,它是M a z e F a c t o r y的子类,保证了墙壁是B o m b e d Wa l l类的而房间是R o o m Wi t h A B o m b的。B o m b e d M a z e F a c t o r y仅需重

定义两个函数:

为建造一个包含炸弹的简单迷

宫,我们仅用 B o m b e d M a z

MazeGame game; BombedMazeFactory factory;

g a m e . C r e a t e M a z e ( f a c t o r y ) ; e F a c t o r y调用C r e a t e M a z e。

C r e a t e M a z e也可以接收一个E n c h a n t e d M a z e F a c t o r y实例来建造施了魔法的迷宫。 注意M a z e F a c t o r y仅是工厂方法的一个集合。这是最通常的实现 Abstract Factory模式的方式。同时注意 M a z e F a c t o r y不是一个抽象类;因此它既作为 A b s t r a c t F a c t o r y也作为 C o n c r e t e F a c t o r y。这是 Abstract Factory模式的简单应用的另一个通常的实现。因为 M a z e F a c t o r y是一个完全由工厂方法组成的具体类,通过生成一个子类并重定义需要改变的操作,它很容易生成一个新的 M a z e F a c t o r y。

C r e a t e M a z e使用房间的S e t S i d e操作以指定它们的各面。如果它用一个 B o m b e d M a z e F a c t o r y创建房间,那么该迷宫将由有 B o m b e d Wa l l面的 R o o m Wi t h A B o m b对象组成。如果 R o o m Wi t h A B o m b必须访问一个B o m b e d Wa l l的与特定子类相关的成员,那么它将不得不对它的墙壁引用以进行从 Wa l l *到B o m b e d Wa l l *的转换。只要该参数确实是一个 B o m b e d Wa l l,这个向下类型转换就是安全的,而如果墙壁仅由一个 B o m b e d M a z e F a c t o r y创建就可以保证这一点。

当然,像S m a l l t a l k这样的动态类型语言不需要向下类型转换,但如果它们在应该是 Wa l l的子类的地方遇到一个 Wa l l类可能会产生运行时刻错误。使用 Abstract Factory建造墙壁,通过确定仅有特定类型的墙壁可以被创建,从而有助于防止这些运行时刻错误。

让我们考虑一个S m a l l t a l k版本的M a z e F a c t o r y,它仅有一个以要生成的对象种类为参数的 m a k e操作。此外,具体工厂存储它所创建的产品的类。

首先,我们用S m a l l t a l k写一个等价的C r e a t e M a z e:

本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用

本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用

正如我们在实现一节所讨论, M a z e F a c t o r y仅需一个实例变量 p a r t C a t a l o g来提供一个字典,

这个字典的主键为迷宫组件的类。也回想一下

我们是如何实现 m a k e :方法的:

现在我们可以创建一个 M a z e F a c t o r y并用它来实现 C r e a t e M a z e。我们将用类 M a z e G a m e

的一个方法C r e a t e M a z e F a c t o r y来创

建该工厂。

通过将不同的类与它们的主键相关联,就可以

创建一个 B o m b e d M a z e F a c t o r y或E n

c h a n t e d M a z e F a c t o r y。例如,一个E n c h a n t e d M a z e F a c t o r y可以这样被创建:

11. 已知应用

I n t e r Vi e w使用“K i t”后缀

[ L i n 9 2 ]来表示A b s t r a c t F a

c t o r y类。它定义 Wi d g e t K i t

和D i a l o g K i t抽象工厂来生成与特定视感风格相关的用户界面对象。 I n t e r Vi e w还包括一个L a y o u t K i t,它根据所需要的布局生成不同的组成( c o m p o s i t i o n)对象。例如,一个概念上是水平的布局根据文档的定位(画像或是风景)可能需要不同的组成对象。

E T + + [ W G M 8 8 ]使用Abstract Factory模式以达到在不同窗口系统(例如, X Wi n d o w s和 S u n Vi e w)间的可移植性。 Wi n d o w S y s t e m抽象基类定义一些接口,来创建表示窗口系统资源的对象(例如 M a k e Wi n d o w、M a k e F o n t、M a k e C o l o r)。具体的子类为某个特定的窗口系统实现这些接口。运行时刻, E T + +创建一个具体 Wi n d o w S y s t e m子类的实例,以创建具体的系统资源对象。

12. 相关模式 A b s t r a c t F a c t o r y类通常用工厂方法( Factory Method(3 . 3))实现,但它们也可以用

设计模式可复用面向对象软件的基础 第3章 创建型模式(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:教育法、教师法、义务教育法、未成年人保护法法律填空

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: