介绍
- 系统中被唯一使用
- 一个类只有一个实例
示例
- 登录框
- 购物车
js版说明
- 单例模式需要用到java的特性(私有属性private),而es6中没有,可以借助ts来实现private
- private:类外部不能new,只能在类内部new,这种属性在UML类图中用“-”表示
js单例模式代码
class SingleObject {
login() {
console.log('login...')
}
}
SingleObject.getInstance = (function () {
let instance
return function () {
if (!instance) {
instance = new SingleObject();
}
return instance
}
})()
// 测试代码
let obj1 = SingleObject.getInstance()
obj1.login()
let obj2 = SingleObject.getInstance()
obj2.login()
console.log(obj1 === obj2) // true
1.以上代码,不通过new SingleObject()直接实例化,用SingleObject.getInstance()实例,保证了SingleObject类只实例化一次,从而使得obj1 === obj2
2.注意严格上来说SingleObject在类外是不可以,js版本只能通过口头约束,即不能在类外直接new SingleObject()来实例
3.为了避免口头约束带来的问题,除了用ts技术的private属性外,可以通过es6的模块方式来处理。
利用模块化处理private问题
class SingleObject {
constructor() {
...
}}
// 返回单例
let getSingleObject = (function () {
let get
return function () {
if (!get) {
get = new SingleObject();
}
return get
}
})()
export default getSingleObject
以上代码中,只暴露getSingleObject方法,利用返回函数闭包+模块化实现了不能、不直接new SingleObject的途径