1、模式标准
模式名称:单例模式
模式分类:创建型
模式意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
结构图:
适用于:
- 当类只能有一个实例而且这个实例易于通过一个访问点访问时。
- 当这个唯一的实例应该是通过子类化可扩展的,并且用户应该无需更改代码就能使用一个扩展的实例时。
2、分析与设计
有一些类会自带单例模式,有些采用统一的单例去管理。因为我们是设计一个游戏框架所以这里采用了统一的方式。方便认识整个系统中那些系统使用了单例。
意图:保证一个全局唯一的单例,并提供一个访问它的全局访问点。
3、开始打造
TypeScript
export class SingletonInstance {
// 设计模式5(单例模式)
private static _instance: SingletonInstance = new this()
static get instance(): SingletonInstance {
return this._instance
}
static getInstance() {
return this._instance
}
/** 当前游戏 */
game: DemoGame
// game: JCQGame
// game: FeijianGame
/** 本地存储 */
storage: StorageManager = new StorageManager();
/** 事件管理 */
eventBus: EventManager = new EventManager()
/** 游戏时间管理 */
timer: TimerManager = new TimerManager();
}
export var gameInstance = SingletonInstance.instance;
4、开始使用
TypeScript
import { gameInstance } from './SingletonInstance';
const { ccclass, property } = _decorator;
/**
* 总入口
*/
@ccclass('Main')
export class Main extends Component {
/** 界面层节点 */
@property({ type: Node, tooltip: "界面层Node" })
public gui: Node = null;
/** 游戏层节点 */
@property({ type: Node, tooltip: "游戏层Node" })
public game: Node = null;
/** 游戏编码 */
@property({ tooltip: "游戏编码" })
public gameCode: string = '';
start() {
if (DEBUG) profiler.showStats();
}
onLoad() {
window['xhgame'] = xhgame // 方便console中查看全局
// game.frameRate = 30;
// 设计模式3(生成器模式)
const gameDesign = new GameDesign();
switch (this.gameCode) {
case 'demo': // demo
gameDesign.setGameBuilder(new DemoGameBuilder(this));
gameInstance.game = gameDesign.buildGame<DemoGame>()
break;
case 'jianchuqiao': // 剑出鞘
gameDesign.setGameBuilder(new JianchuqiaoGameBuilder(this));
gameInstance.game = gameDesign.buildGame<JCQGame>()
break;
case 'feijian': // 飞剑
gameDesign.setGameBuilder(new FeijianGameBuilder(this));
gameInstance.game = gameDesign.buildGame<FeijianGame>()
break;
}
gameInstance.game.start()
gameInstance.timer.start()
}
在全局访问点gameInstance中设置了设置了当前唯一的游戏game:DemoGame,以及系统种需用到的存储单例,时间单例,及事件单例等等