各种设计模式的使用场景
1. Creational Patterns 创建型模式
1.1 Prototype Pattern 原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
应用场景:不是同一个对象,但是属于同类的复制,例如复印技术。
1.2 Singleton Pattern 单例模式
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
应用场景:控制游戏中声音播放;UI窗口显示;资源加载;计时器等。
1.3 Abstract Factory Pattern 抽象工厂模式
提供一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体的实现类。
应用场景:同一种类的使用,游戏难度、游戏阵营:不同级别难度下游戏可以产生不同类型的建筑、英雄以及技能;AI 战术选择:实现确定好几种可选战术作为产品族,每种战术按照类似海军、空军、陆军作为产品等级结构选择具体兵种进行生产建造;国际化:用户改变语言环境时,会改变响应的文字显示,音效,图片显示,操作习惯适配等;皮肤更换或者资源管理:用户选择不同主题的皮肤将会影响图片显示以及动画效果;屏幕适配:对高、中、低分辨率的移动设备使用不同的显示资源。
1.4 Builder Pattern 建造者模式
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
应用场景:需要生成的产品对象复杂内部结构,这些产品具备共性;隔离复杂的对象的创建和使用,并使的相同的创建的不同的产品。
1.5 Factory Method Pattern 工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
应用场景:游戏场景转换;角色AI状态管理。
2. Structural Patterns 结构型模式
2.1 Adapter Pattern 适配器模式
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
应用场景:转接,复用已有的功能,但已有的功能接口不是客户端想要的。
2.2 Bridge Pattern 桥接模式
将抽象和实现解耦,使得两者可以独立地变化。
应用场景:一个类存在两个独立变化的维度,且这两个维度都需要进行扩展;需要从继承或多重继承中简化结构,且应对频繁变动的需求。
2.3 Composite Pattern 组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
应用场景:不同的界面的逻辑和UI通过一个管理器统一控制。
2.4Decorator Pattern 装饰模式
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
应用场景:写好一个相应的战斗模块,但是在进入之前或者进入之后添加一些,输出日志、数据监测、数据收集埋点触发之类的功能。
2.5 Facade Pattern 外观模式
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。
应用场景:汽车的内部运作机制复杂,但是它给我们提供了方向盘、仪表盘、刹车、油门这些高级接口,我们便不需要了解引擎系统、动力传输系统等复杂系统,所以外观模式的重点在于,隐藏系统内部的互动细节,并提供简单方便的接口。之后让客户端只需要通过这个接口,就可以操作一个复杂的系统,并让它们顺利运行。
2.6 Flyweight Pattern 享元模式
使用共享对象可有效地支持大量的细粒度的对象。
应用场景:五子棋创建;游戏中某些不断创建销毁的物体,子弹对象池。
2.7 Proxy Pattern 代理模式
使用共享对象可有效地支持大量的细粒度的对象。
应用场景:代理Text, Button, Image等组件的功能;登陆设置;委托;代理下载资源等。
3. Behavioral Patterns 行为型模式
3.1 Command Pattern 命令模式
命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,同时支持可撤消的操作。
应用场景:用户的客户端请求,实现请求的队列操作和日志光里,并且支持对操作进行撤销回退。
3.2 State Pattern 状态模式
当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。
应用场景:角色状态;AI状态;账号登录状态;场景状态;动画机状态等。
3.3 Observer Pattern 观察者模式
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
应用场景:发布;订阅消息;角色血条值下降被改变(防御力、攻击力等)。
3.4 Chain of Responsibility Pattern 责任链模式
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
应用场景:如游戏中敌方角色的设置、通关条件、下一关纪录。
3.5 Mediator Pattern 中介者模式
用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
应用场景:感知系统,里面涉及视觉感应器、听觉感应器、视觉触发器、听觉触发器等交互可通过中介者完成。
3.6 Interpreter Pattern 解释器模式
给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
应用场景:编译器;这些程序代码经过一般文本编辑器编写完成后放入指定的位置,例如Lua。
3.7 Iterator Pattern 迭代器模式
提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
应用场景:C#自带的IEnumerator;需要按指定顺序迭代查询集合中的元素。
3.8 Memento Pattern 备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
应用场景:资源备份;历史记录;还原操作。
3.9 Strategy Pattern 策略模式
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
应用场景:算法与环境都独立开来,算法的增减、修改不会对环境和客户端影响.例如:外挂[同步图片、名言、笑话,各自的售卖算法];技能效果类和方法的构建。
3.10 Template Method Pattern 模板方法模式
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
应用场景:技能效果类和方法的构建。
3.11 Visitor Pattern 访问者模式
封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
应用场景:例如利用一个类,表示敌人和士兵都可以访问在做一样的事情,可以封装一个父类,然后子类继承。