本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用
第3章创建型模式
创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那 些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委 托给另一个对象。
随着系统演化得越来越依赖于对象复合而不是类继承,创建型模式变得更为重要。当这 种情况发生时,重心从对一组固定行为的硬编码( h a r d - c o d i n g)转移为定义一个较小的基本 行为集,这些行为可以被组合成任意数目的更复杂的行为。这样创建有特定行为的对象要求 的不仅仅是实例化一个类。
在这些模式中有两个不断出现的主旋律。第一,它们都将关于该系统使用哪些具体的类 的信息封装起来。第二,它们隐藏了这些类的实例是如何被创建和放在一起的。整个系统关 于这些对象所知道的是由抽象类所定义的接口。因此,创建型模式在什么被创建,谁创建它, 它是怎样被创建的,以及何时创建这些方面给予你很大的灵活性。它们允许你用结构和功能 差别很大的“产品”对象配置一个系统。配置可以是静态的(即在编译时指定),也可以是动 态的(在运行时)。
有时创建型模式是相互竞争的。例如,在有些情况下 P r o t o t y p e(3 . 4)或Abstract Factory (3 . 1)用起来都很好。而在另外一些情况下它们是互补的: B u i l d e r(3 . 2)可以使用其他模式去实现某个构件的创建。P r o t o t y p e(3 . 4)可以在它的实现中使用 S i n g l e t o n(3 . 5)。 因为创建型模式紧密相关,我们将所有5个模式一起研究以突出它们的相似点和相异点。 我们也将举一个通用的例子—为一个电脑游戏创建一个迷宫—来说明它们的实现。这个迷 宫和游戏将随着各种模式不同而略有区别。有时这个游戏将仅仅是找到一个迷宫的出口;在 这种情况下,游戏者可能仅能见到该迷宫的局部。有时迷宫包括一些要解决的问题和要战胜 的危险,并且这些游戏可能会提供已经被探索过的那部分迷宫地图。
我们将忽略许多迷宫中的细节以及一个迷宫游戏中有一个还是多个游戏者。我们仅关注 迷宫是怎样被创建的。我们将一个迷宫定义为一系列房间,一个房间知道它的邻居;可能的 邻居要么是另一个房间,要么是一堵墙、或者是到另一个房间的一扇门。
类R o o m、D o o r和Wa l l定义了我们所有的例子中使用到的构件。我们仅定义这些类中对创 建一个迷宫起重要作用的一些部分。我们将忽略游戏者、显示操作和在迷宫中四处移动操作, 以及其他一些重要的却与创建迷宫无关的功能。
下页图表示了这些类之间的关系。每一个房间有四面,我们使用 C + +中的枚举类型D i r e c t i o n来指定房间的东南西北:
enum Direction {North, South, East, West};
S m a l l t a l k的实现使用相应的符号来表示这些方向。
类M a p S i t e是所有迷宫组件的公共抽象类。为简化例子, M a p S i t e仅定义了一个操作E n t e r, 它的含义决定于你在进入什么。如果你进入一个房间,那么你的位置会发生改变。如果你试 图进入一扇门,那么这两件事中就有一件会发生:如果门是开着的,你进入另一个房间。如果门是关着的,那么你就会碰壁。
本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用
E n t e r为更加复杂的游戏操作提
供了一个简单基础。例如,如果你在
一个房间中说“向东走”,游戏只能确定
直接在东边的是哪一个 M a p S i t e并
对它调用E n t e r。特定子类的E n t e r
操作将计算出你的位置是发生改变,
还是你会碰壁。在一个真正的游戏中,
E n t e r可以将移动的游戏者对象作为
一个参数。
R o o m是M a p S i t e的一个具体
的子类,而 M a p S i t e定义了迷宫中
构件之间的主要关系。 R o o m有指向
其他M a p S i t e对象的引用,并保存一
个房间号,这个数字用来标识迷宫中
的房间。
下面的类描述了一个房间的每一面所出现的
墙壁或门。
本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用
我们不仅需要知道迷宫的各部分,还要定义一个用来表示房间集合的 M a z e类。用 R o o m N o操作和给定的房间号,M a z e就可以找到一个特定的房间。
R o o m N o可以使用线形搜索、 h a s h表、甚
至一个简单数组进行一次查找。但我们在此处并不
考虑这些细节,而是将注意力集中于如何指定一个
迷宫对象的构件上。
我们定义的另一个类是 M a z e G a m e,由它
来创建迷宫。一个简单直接的创建迷宫的方法是使
用一系列操作将构件增加到迷宫中,然后连接它们。
例如,下面的成员函数将创建一个迷宫,这个迷宫由两个房间和它们之间的一扇门组成:
考虑到这个函数所做的仅是创建一个有两个房间的迷宫,它是相当复杂的。显然有办法使它变得更简单。例如, R o o m的构造器可以提前用墙壁来初始化房间的每一面。但这仅仅是将代码移到了其他地方。
这个成员函数真正的问题不在于它的大
小而在于它不灵活。它对迷宫的布局进
行硬编码。改变布局意味着改变这个成
员函数,或是重定义它—这意味着重新
实现整个过程—或是对它的部分进行改
变—这容易产生错误并且不利于重用。
创建型模式显示如何使得这个设计更灵
活,但未必会更小。特别是,它们将便
于修改定 义一个迷宫构件的类。
本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说医药卫生设计模式可复用面向对象软件的基础 第3章 创建型模式在线全文阅读。
相关推荐: