为什么会有这个例子?
由于创建型模式紧密相关,因此将5个创建型模式以同一个例子来研究更容易说明它们的相似点和相异点。
例子:为一个电脑游戏创建一个迷宫。这个迷宫和游戏可能会随着模式的不同而有所区别:有时候仅仅需要找到一个迷宫的出口;而有时候迷宫可能包括一些要解决的问题等等。
由于首先研究创建型模式,因此我们目前只关心迷宫是怎样被创建的,而不用去关心其他的细节。我们将迷宫定义为一系列的房间,每个房间都知道它的邻居:要么是房间,要么是墙,再要么是通往另一个房间的一扇门。
因此这里将会有三个类:Room, Door和Wall,此外我们还应该关心一下方向,因为一个人站在房间里会有四个方向可以移动,那么就会有一个Direction枚举。
另外,我们可能还需要一个地图,地图上会标明已经探索过的一些元素,如Room或者Wall,因此我们给出一个迷宫元素的基类:MapSite,为了方便,我们给它简单定义一个操作Enter,表示你进入了一个迷宫的元素。下面是他们的关系图及一部分代码:(注:代码仅仅是为了说明,本身无任何意义)
由于Wall类比较简单,因此就不再占用篇幅。至此为止我们定义完了迷宫,下一步我们将要在游戏中生成一个迷宫。一个最直接最简单同时也是最常用的方法就是进行硬编码:
这样,我们生成了一个很简单的迷宫,它仅仅由两个房间以及它们之间的一扇门组成。
现在假设我们有一个新游戏,需要重用上面已有的迷宫布局,但是迷宫中的门是有锁的,需要钥匙才可以打开。很显然,上面的硬编码实现将导致CreateMaze很难重用,于是创建型模式便要登场了。