单例的厉害之处


昨天在领导手把手指导下写了一个单例组件,今天早上看了一遍代码,简单小结一下这个组件的实现过程以加深印象。

组件使用的场景:一个屏幕中有很多鱼游来游去,点击一条鱼,出现一个介绍弹窗,弹窗有内容,内容分图片、声音、视频等类型资源。

弹窗本身是一个单例组件,弹窗中的内容是一个单例组件。点击不同的鱼,出现的内容不同。

一、实现单例:

export class PanelContent extends egret.DisplayObjectContainer {
	public static get instance(): PanelContent {
            if (!PanelContent._instance) {
                PanelContent._instance = new PanelContent()
            }
            return PanelContent._instance
        }
        
        public constructor() {
            super()
            this.initView()
            
            this.data = RES.getRes('fishInfo_json')
        }
        
        private initView {
        	this.addEventListener(egret.Event.REMOVED_FROM_STAGE, this.onDestory, this)
        	// 初始化图片、声音、视频等资源的变量
        }
        
        public show(key: string) {
            if (!this.data[key]) {
                return
            }
            
            this.dataItem = this.data[key]
            
            // 根据传入的鱼名称设置它的具体资源
        }
}

二、使用这个单例:

switch(name) {
    case 'fish1':
      PanelContent.instance.show('crocodile')
      InteractPannel.instance.setContent(PanelContent.instance)
      InteractPannel.instance.show();
}

一个类的单例是这个类的一个实例。用单例方式使用这个类以后,这个类的对象只会在内存中存在一个。

呼应标题,单例模式的厉害之处在于,每次使用 PanelContent.instance 时,如果这个类的静态属性instance没有指向一个对象,就创建一个这个类的对象,并把初始化一些对象的属性。这些是静态的,每条鱼的处理都一样。

  • 那么点击不同的鱼显示相应的介绍,怎么实现?

  • 让这个类暴露出show()这个成员方法,让它接受参数以满足不同的鱼的信息显示

  • 怎么通过一个参数就拿到有关这个鱼的所有相关资源?

  • 在外部管理一个 json 静态文件,将所有鱼的相关资源地址都写进去,在show()方法中,获取指定鱼的资源。


2021-12-21