JavaScript設計模式學習之單例模式

GabrielChenCN發表於2015-11-04

一、單例模式介紹

                單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在一個,單例模式是最好的解決方案。
-----百度百科

單例模式實現思路:
             單例模式的實現原理是在singleton模式下,如果該例項不存在,可以通過一個方法建立一個類來實現建立類的新例項,如果例項已經存在,它會返回該物件的引用

二、單例模式的JavaScript實現


標準實現方法:
/*singleton Pattern 單例模式經典實現*/
var singleton = (function(){
//例項保持一個singleton的引用
var instance;
function init(){
//私有變數
function privateMethod() {
console.log("i am private method");
}


var privateName = "Gabriel chen";
var privateAge  =  "21";
var random = Math.random();
return {
//公有變數和方法
publicHobby : "coding javascript",
publicFriend : "chrome",
publicGetAge : function(){return privateAge},
getRandom : function(){ return random}
};


};


return {
//single實現原理,檢查singleton例項,存在返回,不存在新建
getInstance : function(){
if(!instance){
instance = init();
}
return instance;
}
}
//立即呼叫初始化
})()


var s1= singleton.getInstance();
var s2 =  singleton.getInstance();
console.log(s1.getRandom()===s2.getRandom());

               

實現方法二:閉包方式
var single = (function(){

    var unique;

    function Construct(){

        // ... 生成單例的建構函式的程式碼
        //私有變數
        var privateName = "陳";
        var random = Math.random();
        //公有方法和變數
        this.name = "chen";
        this.age="21";
        
        this.getPri =function(){return privateName};
        this.getRandom =function(){return random};
    }



    unique = new Construct();



    return unique;

})(); 
var s1 = single;
var s2 = single ;
s1.name = "siming" ;
console.log(s2.getRandom()===s1.getRandom())


三、單例模式的應用場景



//網站計數器

var  myCounter = (function(){
	var counter;
	function init(){
		var  count = 0;
		this.addCount=function(){
			count=count+1;
		};
		this.getCount = function(){
			return count;
		};

		return this;
	}

	return {
		getCounter : function(){
			if (!counter) {
			counter = init();
		    }
		    return counter;
		}
		
	}
})();
var c = myCounter.getCounter();
c.addCount();
c.addCount();
var b = myCounter.getCounter();
b.getCount();




相關文章