说明:只要实例化一次,超过一次的实例化过程会返回之前实例化的结果,而不会在内存中再次写入新的实例对象。----类似于once。
需要遵守的原则:“单一职责的原则”,每一个类或者函数只负责一个功能。
最佳实践:使用代理方式实现单例模式,使用一个代理函数来实现实单例例化
原生的js代码
/* 摘自《JavaScript设计模式与开发实践》 */
var CreateDiv = function( html ){
this.html = html;
this.init();
};
CreateDiv.prototype.init = function(){
var div = document.createElement( 'div' ); div.innerHTML = this.html; document.body.appendChild( div );
};
// 下来代理类 proxySingletonCreateDiv
var ProxySingletonCreateDiv = (function(){
var instance;
return function( html ){
if ( !instance ){
instance = new CreateDiv( html );
}
return instance;
}
})();
// 测试函数
var a = new ProxySingletonCreateDiv( 'sven1' );
var b = new ProxySingletonCreateDiv( 'sven2' );
alert( a === b ); //返回true
TS版的用class实现的单例模式代码
class Singleton{
name:string;
constructor(name:string){
this.name = name;
this.init();
}
private init() {
console.log("已创建");
}
}
class ProxySingleton{
protected static instance:any = null;
constructor(public name:string){
if( !ProxySingleton.instance ){
ProxySingleton.instance = new Singleton(this.name);
}
return ProxySingleton.instance;
}
}
// test
let a = new ProxySingleton("张三");
let b = new ProxySingleton("李四");
console.log(a===b); //返回true