是Wall的子类的地方遇到一个Wall类可能会产生运行时刻错误。使用AbstractFactory建造墙壁,通过确定仅有特定类型的墙壁可以被创建,从而有助于防止这些运行时刻错误。让我们考虑一个Smalltalk版本的MazeFactory,它仅有一个以要生成的对象种类为参数的make操作。此外,具体工厂存储它所创建的产品的类。首先,我们用Smalltalk写一个等价的CreateMaze:
ff正如我们在实现一节所讨论,MazeFactory仅需一个实例变量partCatalog来提供一个字典,这个字典的主键为迷宫组件的类。也回想一下我们是如何实现make方法的:现在我们可以创建一个MazeFactory并用它来实现CreateMaze。我们将用类MazeGame的一个方法CreateMazeFactory来创建该工厂。通过将不同的类与它们的主键相关联,就可以创建一个BombedMazeFactory或E
cha
tedMazeFactory。例如,一个E
cha
tedMazeFactory可以这样被创建:11已知应用I
terView使用“Kit”后缀Li
92来表示AbstractFactory类。它定义WidgetKit和DialogKit抽象工厂来生成与特定视感风格相关的用户界面对象。I
terView还包括一个LayoutKit,它根据所需要的布局生成不同的组成(compositio
)对象。例如,一个概念上是水平的布局根据文档的定位(画像或是风景)可能需要不同的组成对象。ETWGM88使用AbstractFactory模式以达到在不同窗口系统(例如,XWi
dows和Su
View)间的可移植性。Wi
dowSystem抽象基类定义一些接口,来创建表示窗口系统资源的对象(例如MakeWi
dow、MakeFo
t、MakeColor)。具体的子类为某个特定的窗口系统实现这些接口。运行时刻,ET创建一个具体Wi
dowSystem子类的实例,以创建具体的系统资源对象。12相关模式AbstractFactory类通常用工厂方法(FactoryMethod(33))实现,但它们也可以用Prototype实现。一个具体的工厂通常是一个单件(Si
gleto
(35))。
32BUILDER(生成器)对象创建型模式
1意图2动机将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
f一个RTF(RichTextFormat)文档交换格式的阅读器应能将RTF转换为多种正文格式。该阅读器可以将RTF文档转换成普通ASCII文本或转换成一个能以交互方式编辑的正文窗口组件。但问题在于可能转换的数目是无限的。因此要能够很容易实现新的转换的增加,同时却不改变RTF阅读器。一个解决办法r