一扇仅随着一个咒语才能被锁上和打开的门;以及E
cha
tedRoom,一个可以有不寻常东西的房间,比如魔法钥匙或是咒语。你怎样才能较容易的改变CreateMaze以让它用这些新类型的对象创建迷宫呢?这种情况下,改变的最大障碍是对被实例化的类进行硬编码。创建型模式提供了多种不同方法从实例化它们的代码中除去对这些具体类的显式引用:如果CreateMaze调用虚函数而不是构造器来创建它需要的房间、墙壁和门,那么你可以创建一个MazeGame的子类并重定义这些虚函数,从而改变被例化的类。这一方法是FactoryMethod(33)模式的一个例子。如果传递一个对象给CreateMaze作参数来创建房间、墙壁和门,那么你可以传递不同的参数来改变房间、墙壁和门的类。这是AbstractFactory(31)模式的一个例子。如果传递一个对象给CreateMaze,这个对象可以在它所建造的迷宫中使用增加房间、墙壁和门的操作,来全面创建一个新的迷宫,那么你可以使用继承来改变迷宫的一些部分或该迷宫被建造的方式。这是Builder(32)模式的一个例子。如果CreateMaze由多种原型的房间、墙壁和门对象参数化,它拷贝并将这些对象增加到迷宫中,那么你可以用不同的对象替换这些原型对象以改变迷宫的构成。这是Prototype(34)模式的一个例子。剩下的创建型模式,Si
gleto
(35),可以保证每个游戏中仅有一个迷宫而且所有的游戏对象都可以迅速访问它不需要求助于全局变量或函数。Si
gleto
也使得迷宫易于扩展或替换,且不需变动已有的代码。
31ABSTRACTFACTORY(抽象工厂)对象创建型模式
1意图提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。2别名Kit3动机考虑一个支持多种视感(looka
dfeel)标准的用户界面工具包,例如Motif和Prese
tatio
Ma
ager。不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格。为解决这一问题我们可以定义一个抽象的WidgetFactory类,这个类声明了一个用来创建每一类基本窗口组件的接口。每一类窗口组件都有一个抽象类,而具体子类则实现了窗口组件的特定视感风格。对于每一个抽象窗口组件类,WidgetFactory接口都有一个返回新窗口组件对象的操作。客户调用r