说明
重塑那忘却的记忆,捡补没有必要的知识
概念
前端:确保一个类只有一个实例(前端是模拟类class)
后端:确保一个类只有一个实例
场景:这个物品只能有一个(比如限量级跑车);
如何理解
单例模式是最最最简单的模式,就是说,确保这个东西只能有一个;因为设计模式,一般来说,是从后端开始理解的,毕竟前端的js太飘了;从严格定义来说,我们还是从后端开始
后端看单例模式
java.test
/**有些对象只需要有一个就可以了,比如弹出框!**/
//饿汉模式
public Class Single{
//把构造方法设置为私有化,不允许外部直接创建对象
private Single(){}
//创建类的唯一实例
private Static Single instance = new Single();
//提供一个用于获取实例的方法
public Static Single getInstance(){return instance}
}
//懒汉模式
public Class Single{
//把构造方法设置为私有化,不允许外部直接创建对象
private Single(){}
//创建类的唯一实例
private Static Single instance;
//提供一个用于获取实例的方法
public Static Single getInstance(){
if(instance == null){ return new Single();}
else{ return instance }
}
}
前端看单例模式
由于前端es6推出了模拟类的写法,所以这里我采用class的写法
这里主要是思想的打通,仿照Java的模式,其实最终的目的,是实现这个类不能多实例化,即使实例化,也必须是一样的;我们可以全局声明一个变量,然后实例化的时候去判断是否存在,但这样显然存在问题,就是把工作都交给使用者了,我们有没有办法在class里面,让使用者实例化时就有所提示呢?针对这个想法,我们去实现。
//由于前端js的构造函数没有办法私有化,默认要执行的,所以这里的单例函数,我们可以使用静态的方法来实例化,但是这样就不能用new了;这里的核心思想,其实就是用了类存在后的全局静态属性去存储instance;
class single {
constructor() {
}
static getInstance() {
debugger;
if (this.instance == undefined) {
this.instance = new single();
return this.instance;
} else {
return this.instance;
}
}
}
等价于
class single {
constructor() {
}
static getInstance() {
debugger;
if (single.instance == undefined) {
single.instance = new single();
return single.instance;
} else {
return single.instance;
}
}
}
进化版:其实最好的办法,是我们能够还是保持原有的new来实现,这里主要是利用了this
class SingleClass {
constructor() {
if (SingleClass.instance == undefined) {
SingleClass.instance=this;
return SingleClass.instance;
}else{
return SingleClass.instance;
}
}
}
总结
好了,我感觉还有很多没有理解到位,但是,重要的事理解思想;
思想:实例化的对象有且只有一个;这也就是单例模式咯;