1. 单例模式
分类:创建型
关键点: 全局且唯一
2. 任务
函数(Singleton)有成员对象(name),要求实现创建 Singleton 的对象,此对象唯一。
3. JS 实现
3.1. 方法一:
const assert = require('assert').strict;
var Singleton = function (name) {
this.name = name;
this.instance = null;
};
Singleton.prototype.getName = function () {
alert(this.name);
};
Singleton.getInstance = function (name) {
if (!this.instance) {
this.instance = new Singleton(name);
}
return this.instance;
};
var a = Singleton.getInstance('sven1');
var b = Singleton.getInstance('sven2');
assert.equal(a, b); // true
assert.deepEqual(a, b); // true
//此方法无法保护 new Singleton()
3.2. 方法二:
const assert = require('assert').strict;
let Singleton = (function () {
let instance;
return function (name) {
if (instance) {
return instance;
}
instance = new Object();
instance.name = name;
return instance;
};
})();
var a = new Singleton('sven1');
var b = new Singleton('sven2');
assert.equal(a, b); // true
assert.deepEqual(a, b); // true
//为了把 instance 封装起来,我们使用了自执行的匿名函数和闭包,并且让这个匿名函数返回真正的 Singleton 构造方法,这增加了一些程序的复杂度,阅读起来也不是很舒服
3.3. 方法三:
const assert = require('assert').strict;
let CreateObject = function (name) {
let instance = new Object();
instance.name = name;
return instance;
};
var ProxySingletonCreateObject = (function () {
var instance;
return function (html) {
if (!instance) {
instance = new CreateObject(html);
}
return instance;
};
})();
var a = new ProxySingletonCreateObject('sven1');
var b = new ProxySingletonCreateObject('sven2');
assert.equal(a, b); // true
assert.deepEqual(a, b); // true
//以代理方式拆分构造函数,将职责拆分:创建对象+保持对象唯一