属于「创建型模式」,是「GoF」的 23 种设计模式之一。
保证一个特定类只有一个实例,后续使用同一个类创建对象时应得到与已创建对象完全相同的对象。
实现
全局变量
定义一个全局变量或赋值给全局对象属性:
function initSingleton() { if (window.SINGLETON_INSTANCE) { return; }
window.SINGLETON_INSTANCE = { }; }
|
这种方式虽然实现起来最简单,但很轻易就能被外部所修改。
静态属性
将实例缓存在构造函数的静态属性上:
function Singleton() { if (typeof Singleton.instance === 'object') { return Singleton.instance; }
Singleton.instance = this; }
|
这种方式同样会比较轻易被外部修改,但与全局变量相比风险稍小。
重写构造函数
重写构造函数:
function Singleton() { let inst;
Singleton = function Singleton() { return inst; }
Singleton.prototype = this;
inst = new Singleton();
inst.constructor = Singleton;
return inst; }
|
这种方式实现起来比较啰嗦,并且反直觉。
闭包
将实例缓存在闭包中:
const Singleton = (function() { let inst;
return function Singleton() { if (inst) { return inst; }
inst = this;
} })();
|
除了会因闭包而产生额外内存开销之外,这种方式应该是最完美的了!
更多