用23种设计模式打造一个cocos creator的游戏框架----(二)单例模式

1、模式标准

模式名称:单例模式

模式分类:创建型

模式意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

结构图:

适用于:

  1. 当类只能有一个实例而且这个实例易于通过一个访问点访问时。
  2. 当这个唯一的实例应该是通过子类化可扩展的,并且用户应该无需更改代码就能使用一个扩展的实例时。

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,以及系统种需用到的存储单例,时间单例,及事件单例等等

相关推荐
●VON41 分钟前
谁小时候不想要一个游戏修改器?我把电脑 Skill 做成了 Android 小助手
android·游戏·电脑
本原财经7 小时前
卖游戏、筹H股,昆仑万维临IPO磨AI含金量
人工智能·游戏
FairGuard手游加固11 小时前
iOS 游戏加固技术解析:代码混淆、资源加密、内存保护与重签名检测
安全·游戏·macos·unity·ios·objective-c
AI人工智能+电脑小能手15 小时前
大白话说Java设计模式-42-访问者模式(业务实战篇)
java·spring·设计模式·访问者模式·asm·营销规则·数据结构与操作分离
AI人工智能+电脑小能手16 小时前
大白话说Java设计模式-43-访问者模式(源码剖析篇)
java·设计模式·访问者模式·源码分析·elementvisitor·asm classvisitor·spring spel
智恒百亿1 天前
RTX 5090 全场景技术应用解析:从游戏算力到专业生产力落地
大数据·服务器·游戏
cd_949217211 天前
AI纹理和Substance Painter手绘纹理哪个更适合游戏资产制作?
人工智能·游戏·substance painter
德迅云安全-上官1 天前
游戏攻防反套路:德迅云安全游戏盾如何破解黑产的“低成本精准打击”
网络·安全·游戏
德迅云安全杨德俊1 天前
游戏攻防反套路:游戏盾如何破解黑产的“低成本精准打击”
网络·安全·游戏
cd_949217211 天前
角色模型用AI生成纹理靠谱吗,能直接用于游戏吗?
人工智能·游戏