文章目录
单例模式含义单例模式的UML类图及解析代码先用java代码理解一下单例模式的ES6写法
应用场景登录框逻辑
单例模式含义
所谓的单例,就是一个类智能初始化一个实例,而且在系统中被唯一使用,比如一个网站再怎么复杂也只有一个登录框
单例模式的UML类图及解析
instance前面的减号代表是不能被外部访问的是私有的,-SingleObject是一个私有的构造函数,也是不能被外部访问的。满足了一个类只有一个实例的要求。下面的+getInstance就是返回实例了,+号代表public
所以单例模式需要用到java的private特性
代码
先用java代码理解一下
public class SingleObject{
private SingleObject(){
}
private SingleObject instance
= null
public SingleObject
getInstance(){
if(instance
== null
){
instance
= new SingleObject();
}
return instance
;
}
public void login(username
,password
){
System
.out
.println("login...")
}
}
public class SingletonPatternTest{
public static void main(String
[] args
){
SingleObject singleObject
= SingleObject
.getInstance()
}
}
单例模式的ES6写法
class SingleObject {
init() {
console
.log('单例创建成功');
}
}
SingleObject
.getInstance
= (function
() {
let instance
= null
return function
() {
if (!instance
) {
instance
= new SingleObject()
}
return instance
}
})()
const obj1
= SingleObject
.getInstance()
console
.log(obj1
);
const obj2
= SingleObject
.getInstance()
console
.log(obj2
);
console
.log(obj1
=== obj2
);
const objNo
= new SingleObject()
console
.log(objNo
);
console
.log(objNo
=== obj1
);
注意:这个getInstance是一个静态方法,必须卸载class的外面.,只有这样才能符合单例模式的要求.js相对于java不会在new的时候报错,但是new穿件的并不是一个单例,这点是可以解决的需要更多的代码
应用场景
登录框逻辑
class loginForm {
constructor() {
this.state
= 'hide'
}
show() {
if (this.state
=== 'show') {
console
.log('登录框已经被显示,不能重复显示了');
alert('登录框已经被显示,不能重复显示了')
return
} else {
this.state
= 'show'
console
.log("登录框显示成功");
}
}
close() {
if (this.state
=== 'hide') {
console
.log('登录框已经被隐藏了,可以使用show方法显示');
} else {
this.state
= 'hide'
console
.log('登录框隐藏成功');
}
}
}
loginForm
.getInstance
= (function
() {
let instance
= null
return function
() {
if (!instance
) {
instance
= new loginForm()
}
return instance
}
})()
const form1
= loginForm
.getInstance()
form1
.show()
const form2
= loginForm
.getInstance()
form2
.show()
效果