最简单的单例模式
1.啥是单例模式?
答:单例模式就是一个类只有一个实例
2.为啥不用全局变量来实现呢?
答:因为单例模式既能有全局变量的优点,可以全局访问,但是没有全局变量的缺点
3.啥缺点?
答:如果我们要在一个全局脚本中放一个对象,那么我们要在程序运行前就创建好,如果是开发游戏,我们要在游戏运行前创建好这个对象,但是如果程序在运行时没有用到呢
比如在游戏中需要对需要动态加载资源进行管理(ResMgr),对很多弹窗进行管理(UIMgr),对场景进行管理(场景切换,当前是哪个场景),这些Manager都是单例,如果不使用单例也可以把这些Mgr写成一个类,在游戏开始之前,实例化这些类,但是只实例化一次,保存在全局变量中
单例的好处就是需要的时候,在进行实例化,不用把啥东西都放在全局变量中
4.如何实现单例模式?
先了解两个概念,静态方法和静态变量
4.1.啥是静态变量
?
一个类是所有实例的蓝图,模板,照着这个模板我们可以造出很多实例,在写一个类的时候,类有一些属性,还有一些方法,这些属性也可以被叫做变量,用来保存实例的状态和数据,比如我们要创建一个Dog类,我们需要一个color来保存狗的颜色。一个类的变量对所有的实例都是不变的,那么这个变量就叫静态变量(静态属性),
,比如Dog类需要一个静态变量bark
:‘wangwang’,来表示所有的狗的叫声都是一样的
class Dog{
static bark = 'wangwang'
}
如果这变量对每个实例都是不一样的,就叫实例变量,或者也可以叫属性
4.2 啥是静态方法
静态方法是不需要进行实例化,就能调用的方法,就是静态方法,比如Math.round(),我们不需要实例化一个Math对象出来,
就能直接调用这个方法,当然你也无法实例化出这个对象,因为这个Math类的构造函数是私有的,不允许你进行访问,大概就是这个意思
凡是这个一个方法不需要用到实例变量
,那么对所有实例来说,这个方法是一样的,不需要从类实例化出一个对象,可以直接从类的身上调用,那么你需要创建的这个方法前面也需要加上static
关键字,代表这个方法是静态方法
重点来了
假设我们需要创建一个资源加载管理类 ResMgr,我们可以用静态变量来保存这个类的实例,使用静态方法来返回这个类的实例,因为静态方法不需要实例化类就能调用,在静态方法中,我们只对这个类实例化了一次,对这个ResMgr我们第一次调用getInstance的方法,访问这个类的静态变量,我们实例化出了一个ResMgr的实例,第二次调用这个getInstance的方法的时候,我们我们再次访问到了这个类的静态变量,静态变量已经有值了,不会二次实例化
//这里只写了一个大概的框架
class ResMgr{
constructor(){
}
private loadedAssetMap = new Map();
static instance = null; //ResMgr的单例
static getInstance (){
if(this.intance==null){
this.instance = new ResMgr();
}
return this.instance;
}
public loadAsset(){
/ 加载资源
}
public loadAssetSync(){
/ 同步加载资源
}
public getAsset(){
//获取加载资源
}
public releaseAsset(){
//释放资源,手动加载的资源需要手动释放
}
}