单例模式
1.作用:将某次类的实例化存档
2.举例:
游戏可以被认为是一个特定的类(Singleton),而存档是单例(instance),每次访问特定类的时候,都会拿到同一个实例。主要有下面几个概念:
- Singleton :特定类,这是我们需要访问的类,访问者要拿到的是它的实例;
- instance :单例,是特定类的实例,特定类一般会提供
getInstance方法来获取该单例; - getInstance :获取单例的方法,或者直接由
new操作符获取;
3.1 IIFE 方式创建单例模式
const Singleton = (function() { //返回内部功能函数:
let _instance = null // 缓存的单例,外部无法修改
const Singleton = function() { //功能函数
if (_instance) return _instance // 判断是否已有单例
_instance = this // 指向改变
this.init() // 初始化操作
return _instance
}
Singleton.prototype.init = function() { // 标识函数
this.foo = 'Singleton Pattern'
}
Singleton.getInstance = function() {
if (_instance) return _instance
_instance = new Singleton()
return _instance
}
return Singleton
})()
const visitor1 = new Singleton() // 第一次实例
const visitor2 = new Singleton() // new直接返回第一次实例对象
const vistor = Singleton.getInstance() // 获取第一次实例对象
console.log(visitor1 === visitor2) // true
3.2单例模式赋能
/* 功能类 */
class FunClass {
constructor(bar) {
this.bar = bar
this.init()
}
}
init () {
this.foo = 'Singleton Pattern'
}}
/* 单例模式的赋能类 */
const Singleton = (function(){
let _instance = null // 缓存单例
const proxySingleton = function (bar) { // 构造函数
if (_instance) return _instance
_instance = new FuncClass(bar)
return _instance
}
ProxySingleton.getInstance = function (bar) {
if (_instance) return _instance
_instance = new Singleton(bar)
return _instance
}
return ProxySingleton
})()
const vistor1 = new Singleton("单例1")
const vistor2 = new Singleton("单例2")
const vistor3 = Singleton.getInstance()
console.log(visitor1 === visitor2) // true
console.log(visitor1 === visitor3) // true
3.3单例模式赋能简便写法
/* Person 类 */
class Person {
constructor(name, age) {
this.name = name
this.age = age
}
}
/* 单例模式的赋能方法 */
function Singleton(FuncClass) { // 构造函数
let _instance // 缓存
return new Proxy(FuncClass,{ // 实例化对象并且拥有自己的构造方法
constructor(target, args) {
return _instance || (_instance = Reflect.construct(FuncClass, args))// 或者用new
// return _instance || (_instancce = new Funclass(args))
}
})
}
const PersonInstance = Singleton(Person)
const person1 = new PersonInstance('张小帅', 25)
const person2 = new PersonInstance('李小美', 23)
console.log(person1 === person2) // true