javascript設計模式-----單例模式

一、單例模式1   (構造函數的靜態屬性保存實例)

function Universe(){
				//如果實例存在則直接返回
				if(typeof Universe.instance === 'object')){
					return Universe.instance;)
				}
				
				this.start_time = 0;
				this.bang = 'big';
				
				Universe.instance = this;
				
				return this;
			}
			//測試
			var uni = new Universe();
			var uni2 = new Universe();
			uni === uni2 //結果爲true;

缺點:instance 屬性是公開的,可以任意修改


二、單例模式2  (閉包--私有靜態成員保存實例--重寫構造函數)

function Universe(){
				//緩存實例
				var instance = this;
				
				this.start_time = 0;
				this.bang = 'big';
				
				//重寫構造函數
				Universe = function(){
					return instance;
				};
			}
			//測試
			var uni = new Universe();
			var uni2 = new Universe();
			uni === uni2 //結果爲true;

缺點:重寫構造函數會造成原型的改變,但返回的引用卻是舊構造函數對象的引用,導致丟失初始化後添加的擴展,因爲沒有指向新構造函數對象的引用

改進:  (讓實例引用指向新構造函數)

function Universe(){
				//緩存實例
				var instance ;
				
				//重寫構造函數
				Universe = function(){
					return instance;
				};
				
				//保留原型屬性\n
				Universe.prototype = this;
				instance = new Universe();
				//重置構造函數指針
				instance.constructor = Universe;
				
				//功能
				this.start_time = 0;
				this.bang = 'big';
				
			}

三、單例模式3( 即時函數,模塊模式,私有成員保存實例)

var Universe = (function(){
				var instance;
				return function(){
					if(instance){
						return instance;
					}
					instance = this;
					
					//功能
					this.start_time = 0;
					this.bang = 'big';
				}
			})()

個人推薦此種模式,如果需要擴展,則應自行提供擴展接口
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章