使用设计模式来提高程序库的重复利用性是大型程序项目开发必须的。但是在“四人帮”的设计模式概述中提到了23 种标准设计模式,不但难以记住,而且有些设计模式更多的适用于应用程序开发,对游戏开发并不是很适配。根据经验,精挑细选后,在这里记录一些自认为有利用价值的设计模式,以便之后自己设计时使用。
一、观察者模式 Observer
观察者的设计意图和作用是: 它将对象与对象之间创建一种依赖关系,当其中一个对象发生变化时,它会将这个变化通知给与其创建关系的对象中,实现自动化的通知更新。
游戏中观察者的适用环境:
角色属性更新。当我们使用观察者模式监听了角色的属性后,那么角色属性的任何改变都将会通知其关联对象。
二、单例模式 Singleton
单件模式的设计意图和作用是: 保证一个类仅有一个实例,并且,仅提供一个访问它的全局访问点。
游戏中单例模式的适用环境:
所有的Manger类。例如UIManager,ResourceManager,MapManager,GoodManager等。
三、迭代器 Iterator
迭代器设计意图和作用是: 提供一个方法,对一个组合对象内各个元素进行访问,同时又不暴露该对象类的内部表示。
游戏中迭代器模式的适用环境:
我们对任何形式的资源通一管理时,不免会将其聚合起来,或者List,或者Vector,我们都需要一个对其进行访问的工具,迭代器无疑是一个利器。
四、状态模式 State:
状态设计意图和作用是: 允许一个对象在其内部状态改变时改变它的行为。主要解决的是当控制一个对象状态转换的条件过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的逻辑判断简单化。
游戏中状态模式的适用环境:
对于游戏中的战斗系统,客户端把游戏动作发送给服务器,服务器计算动作行为的结果,然后广播给客户端各种游戏状态,客户端收到状态,进行相应的表现。
五、原型模式 Prototype
原型模式的设计意图和作用是:使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
游戏中原型模式的适用环境: C#中MemberswiseClone()创建当前对象的浅表副本
在游戏中,可以使用原型模式保存一个对象的状态,以便在需要的时候使用,比如单机游戏的存档。
六、抽象工厂模式 AbstractFactory
抽象工厂的设计意图和作用是: 封装出一个接口,这个接口负责创建一系列互相关联的对象,但用户在使用接口时不需要指定对象所在的具体的类。
游戏中抽象工厂模式的适用环境:
例如,创建一个Unit单位基类,这个单位基类派生出不同的类,有玩家角色,Npc,Monster。玩家角色实现了基类中创建对象的接口。最终用户只需要Unit.Create(path); 就可以创建新的对象。
七、组合模式 Composite
组合模式的设计意图和作用是:组合多个对象形成树形结构,以表示具有“整体-部分”关系的层次结构。
游戏中组合模式的适用环境:
Unity界面的父节点子节点整体部分的层次结构。
八、策略模式 Strategy
策略模式的设计意图和作用是:定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化。
游戏中策略模式的适用环境:
LOL中,不同级别人机难度下,电脑AI的算法不同,难度越高,AI算法越复杂。
对象池与享元模式的区别
在一个对象池中,所有的对象都是等价的,任意两个对象在任何使用场景中都可以被对象池中的其他对象代替。而在享元模式中,享元工厂所维护的所有对象都是不同的,任何两个对象间不能相互代替。
只不过享元模式一个对象可以被多个对象引用,对象池模式一个对象只能被一个对象引用。