创建型模式

创建型模式主要包括:Abstract Factory(抽象工厂模式),Factory Method(工厂模式),Builder(生成器模式), Prototype(原形模式),Singletion(单例模式),后面会逐一讲解它们的用法。

我们先来看一个例子,假如我们想创建一个游戏中的迷宫,我们要怎么做呢?

迷宫包括:房间,墙,门三个基本构件,我们可以使这三个基本构件同时继承一个类MapSite。我们还需要一个类来管理所有创建出来的迷宫的房间。所有我们会得到这样一个设计图:



类MapSite是所有迷宫组件的公共抽象类。为简化例子, MapSite仅定义了一个操作Enter,它的含义决定于你在进入什么。如果你进入一个房间,那么你的位置会发生改变。如果你试图进入一扇门,那么这两件事中就有一件会发生:如果门是开着的,你进入另一个房间。如果门是关着的,那么你就会碰壁。



Enter为更加复杂的游戏操作提供了一个简单基础。例如,如果你在一个房间中说“向东走” ,游戏只能确定直接在东边的是哪一个 MapSite并对它调用Enter。特定子类的Enter操作将计算出你的位置是发生改变,还是你会碰壁。在一个真正的游戏中, Enter可以将移动的游戏者对象作为一个参数。
Room是MapSite的一个具体的子类,而 MapSite定义了迷宫中构件之间的主要关系。Room有指向其他MapSite对象的引用,并保存一个房间号,这个数字用来标识迷宫中的房间。



下面的类描述了一个房间的每一面所出现的墙壁或门。




我们不仅需要知道迷宫的各部分,还要定义一个用来表示房间集合的 Maze类。用RoomNo操作和给定的房间号,Maze就可以找到一个特定的房间。



每一个房间有四面,我们使用C++中的枚举类型Direction来指定房间的东南西北:



我们定义的另一个类是MazeGame,由它来创建迷宫。一个简单直接的创建迷宫的方法是使用一系列操作将构件增加到迷宫中,然后连接它们。例如,下面的成员函数将创建一个迷宫,这个迷宫由两个房间和它们之间的一扇门组成:




这是我们一般会想到的创建迷宫的方法。这个方法有什么问题呢?比如我们的某些门是被施了魔法的,我们必须通过吟唱来开启门,又比如我们想创建不同风格的房间,我们使用这样的方式创建迷宫就需改改很多代码,不灵活。

• 如果CreateMaze调用虚函数而不是构造器来创建它需要的房间、墙壁和门,那么你可以创建一个MazeGame的子类并重定义这些虚函数,从而改变被例化的类。这一方法是Factory Method模式的一个例子。

• 如果传递一个对象给CreateMaze作参数来创建房间、墙壁和门,那么你可以传递不同的参数来改变房间、墙壁和门的类。这是 Abstract Factory模式的一个例子。

• 如果传递一个对象给CreateMaze,这个对象可以在它所建造的迷宫中使用增加房间、墙壁和门的操作,来全面创建一个新的迷宫,那么你可以使用继承来改变迷宫的一些部分或该迷宫被建造的方式。这是Builder模式的一个例子。

• 如果CreateMaze由多种原型的房间、墙壁和门对象参数化,它拷贝并将这些对象增加到迷宫中,那么你可以用不同的对象替换这些原型对象以改变迷宫的构成。这是 Prototype模式的一个例子。

剩下的创建型模式,Singleton,可以保证每个游戏中仅有一个迷宫而且所有的游戏对象都可以迅速访问它 — 不需要求助于全局变量或函数。Singleton也使得迷宫易于扩展或替换,且不需变动已有的代码。

后面我们会逐一用这些设计模式实现创建迷宫的方法。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值