單例模式
單例模式是一種保證一個類僅僅擁有一個實例的模式,使用這種模式,全局僅僅有一個該類的實例,它的實現思路是,構造一個類,這個類擁有instance屬性,這個屬性是一個flag,當它爲null時才能創建一個類的實例,並且把實例賦值給它;創建實例使用的一個靜態方法一般命名爲getInstance
實現一個不透明度單例模式
不透明單例特點是就是不能通過new Single來創建單例,而是通過
Single.getInstance,意味着我們必須知道構造函數裏面的getInstance方法,Single構造函數對我們來說不是透明的
// 方法一: 使用this.instance作flag
var Single = function(name){
this.name = name;
this.instance = null;// 用來判斷是否已經實例化
}
Single.prototype.getName = function(){
console.log(this.name);
}
Single.getInstance = function(name){
if (!this.instance) {
this.instance = new Single(name);
}
return this.instance;
}
var a = Single.getInstance('jinghong');
var b = Single.getInstance('shao');
console.log(a === b);
// 方法一:使用閉包把參數當作flag
var Single = function(name){
this.name = name;
}
Single.prototype.getName = function(){
console.log(this.name);
}
// 自調用函數返回一個函數,這個函數的調用環境和instace構成了閉包,所以在這個函數內部可以修改instance變量
Single.getInstance = (function(name){
var instance = null;// 用來判斷是否已經實例化
return function(name){
if (!instance) instance = new Single(name);
return instance;
}
})();
var a = Single.getInstance('jinghong');
var b = Single.getInstance('shao');
console.log(a === b);
實現透明的單例
透明單例特點是就是不能通過new Single來創建單例,構造函數裏面的內容我們不需要關心,也不用知道,有兩種方法來實現單例:
/ 方法一
// 用代理實現單例模式
var Single = (function(){
// instance和Single都在閉包裏面
var instance = null;
function Single(name){
this.name = name;
}
Single.prototype.getName = function(){
console.log(this.name);
}
// 下面這個函數返回出去
return function(name){
if (!instance) {
instance = new Single(name);
}
return instance;
}
})();
var a = new Single('jinghong');
var b = new Single('shao');
console.log(a === b);
//方法二
//把控制單例的條件語句下載構造函數裏面
var Single = (function(){
var instance = null;
var Single = function(name){
if (instance) {
return instance;
}
this.name = name;
instance = this;
}
Single.prototype.getName = function(){
console.log(this.name);
}
return Single;
})();
var a = new Single('jinghong');
var b = new Single('shao');
console.log(a === b);
javascript中常用惰性單例
在合適的情況才創建對象,並且只創建一個對象
原理:讓getSingle返回一個新的函數,並且用變量result來保存fn的計算結果,result本身在閉包中,永遠不會被銷燬,在將來的請求中,如果result已經被賦值,那麼就會將這個數返回;
應用場景舉例: 將createXhr傳入裏面,如果已經調用了createXhr,再將createXhr傳入裏面,返回的結果仍然是之前調用的結果;
//惰性單例
function getSingle(fn){
var result;
return function(){
return result || (result = fn.apply(this, arguments));
}
}