全球旧事资料 分类
MazeFactory作为一个参数,这样程序员就能指定要创建的房间、墙壁和门等类。回想一下建立一个由两个房间和它们之间的门组成的小迷宫的成员函数CreateMaze。CreateMaze对类名进行硬编码,这使得很难用不同的组件创建迷宫。这里是一个以MazeFactory为参数的新版本的CreateMaze,它修改了以上缺点:我们创建MazeFactory的子类E
cha
tedMazeFactory,这是一个创建施了魔法的迷宫的工厂。E
cha
tedMazeFactory将重定义不同的成员函数并返回Room,Wall等不同的子类。
f现在假设我们想生成一个迷宫游戏,在这个游戏里,每个房间中可以有一个炸弹。如果这个炸弹爆炸,它将(至少)毁坏墙壁。我们可以生成一个Room的子类以明了是否有一个炸弹在房间中以及该炸弹是否爆炸了。我们也将需要一个Wall的子类以明了对墙壁的损坏。我们将称这些类为RoomWithABomb和BombedWall。我们将定义的最后一个类是BombedMazeFactory,它是MazeFactory的子类,保证了墙壁是BombedWall类的而房间是RoomWithABomb的。BombedMazeFactory仅需重定义两个函数:为建造一个包含炸弹的简单迷宫,我们仅用BombedMazeFactory调用CreateMaze。
MazeGamegameBombedMazeFactoryfactorygameCreateMazefactory
CreateMaze也可以接收一个E
cha
tedMazeFactory实例来建造施了魔法的迷宫。注意MazeFactory仅是工厂方法的一个集合。这是最通常的实现AbstractFactory模式的方式。同时注意MazeFactory不是一个抽象类;因此它既作为AbstractFactory也作为Co
creteFactory。这是AbstractFactory模式的简单应用的另一个通常的实现。因为MazeFactory是一个完全由工厂方法组成的具体类,通过生成一个子类并重定义需要改变的操作,它很容易生成一个新的MazeFactory。CreateMaze使用房间的SetSide操作以指定它们的各面。如果它用一个BombedMazeFactory创建房间,那么该迷宫将由有BombedWall面的RoomWithABomb对象组成。如果RoomWithABomb必须访问一个BombedWall的与特定子类相关的成员,那么它将不得不对它的墙壁引用以进行从Wall到BombedWall的转换。只要该参数确实是一个BombedWall,这个向下类型转换就是安全的,而如果墙壁仅由一个BombedMazeFactory创建就可以保证这一点。当然,像Smalltalk这样的动态类型语言不需要向下类型转换,但如果它们在应该r
好听全球资料 返回顶部