本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用
假设你想在一个包含(所有的东西)施了魔法的迷宫的新游戏中重用一个已有的迷宫布局。施了魔法的迷宫游戏有新的构件,像 D o o r N e e d i n g S p e l l,它是一扇仅随着一个咒语才能被锁上和打开的门;以及 E n c h a n t e d R o o m,一个可以有不寻常东西的房间,比如魔法钥匙或是咒语。你怎样才能较容易的改变 C r e a t e M a z e以让它用这些新类型的对象创建迷宫呢?
这种情况下,改变的最大障碍是对被实例化的类进行硬编码。创建型模式提供了多种不同方法从实例化它们的代码中除去对这些具体类的显式引用:
如果C r e a t e M a z e调用虚函数而不是构造器来创建它需要的房间、墙壁和门,那么你可以创建一个 M a z e G a m e的子类并重定义这些虚函数,从而改变被例化的类。这一方法是 Factory Method(3 . 3)模式的一个例子。
如果传递一个对象给 C r e a t e M a z e作参数来创建房间、墙壁和门,那么你可以传递不同的参数来改变房间、墙壁和门的类。这是 Abstract Factory(3 . 1)模式的一个例子。
如果传递一个对象给 C r e a t e M a z e,这个对象可以在它所建造的迷宫中使用增加房间、墙壁和门的操作,来全面创建一个新的迷宫,那么你可以使用继承来改变迷宫的一些部分或该迷宫被建造的方式。这是 B u i l d e r(3 . 2)模式的一个例子。
如果C r e a t e M a z e由多种原型的房间、墙壁和门对象参数化,它拷贝并将这些对象增加到迷宫中,那么你可以用不同的对象替换这些原型对象以改变迷宫的构成。这是 P r o t o t y p e
(3 . 4)模式的一个例子。
剩下的创建型模式,S i n g l e t o n(3 . 5),可以保证每个游戏中仅有一个迷宫而且所有的游戏对象都可以迅速访问它—不需要求助于全局变量或函数。 S i n g l e t o n也使得迷宫易于扩展或替换,且不需变动已有的代码。
3.1 ABSTRACT FACTORY(抽象工厂)—对象创建型模式
1. 意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2. 别名 K i t
3. 动机
考虑一个支持多种视感( l o o k - a n d - f e e l)标准的用户界面工具包,例如 M o t i f和
Presentation Manager。不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格。
为解决这一问题我们可以定义一个抽象的 Wi d g e t F a c t o r y类,这个类声明了一个用来创建每一类基本窗口组件的接口。每一类窗口组件都有一个抽象类,而具体子类则实现了窗口组件的特定视感风格。对于每一个抽象窗口组件类, Wi d g e t F a c t o r y接口都有一个返回新窗口组件对象的操作。客户调用这些操作以获得窗口组件实例,但客户并不知道他们正在使用的是哪些具体类。这样客户就
本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用
不依赖于一般的视感风格,如下页图所示。