Node.js單例模式

1. 先複習一下Javascript中創建對象的幾種方式

1)使用Object構造函數

var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function(){
alert(this.name);
}


2) 使用對象字面量

var person = {
    name : "Nicholas",
    age : 29;
    job : "Software Engineer";
    sayName : function(){
        alert(this.name);
    }
};


3)工廠模式

function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
   alert(this.name);
}
return o;
}
var person1 = createPerson('Nicholas',29,'Software Engineer');
var person2 = createPerson('greg',27,'dortor');


4)構造函數模式:

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
   alert(this.name);
}
}
var person1 = new Person('Nicholas',29,'Software Engineer');
var person2 = new Person('greg',27,'dortor');


5)原型模式

function Person(){
Person.prototype.name="Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
   alert(this.name);
}
}
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true


5.1)更加簡單的原型模式

爲了減少不必要的輸入,也爲了從視覺上更好地封裝原型的功能,用一個包含所有屬性和方法的對象字面量來重寫整個原型對象。[缺點]以這種方式重設constructor屬性會導致它的[[Enumerable]]特性被設置爲true,默認情況下原生的constructor屬性是不可枚舉的。

function Person(){};
Person.prototype = {
constructor: Person,
name : 'Nicholas',
age : 29,
job : 'Software Engineer',
sayName : function(){
   alert(this.name);
}
};


6)組合模式

組合使用構造函數模式和原型模式是創建自定義類型的最常見方式。構造函數模式用於定義實例屬性,而原型模式用於定義方法和共享的屬性。這種混成模式還支持向構造函數傳遞參數,是用來定義引用類型的一種默認模式

unction Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["shelby","Court"];
}
Person.prototype = {
constructor: Person,
sayName : function(){
   alert(this.name);
}
}
var person1 = new Person('Nicholas',29,'Software Engineer');
var person2 = new Person('greg',27,'dortor');
person1.friends.push("van");
alert(person1.friends); // ["Shelby","Court","Van"];
alert(person2.friends) ;// ["shelby","Court"]
alert(person1.friends == person2.friends); //false
alert(person1.sayName == person2.sayName); //true


2. Node.js中的單例模式實現

單例類對象的創建使用的是上面第6種方式:組合模式

創建single_class.js,實現單例類,代碼如下:

/* single_class.js */
var _instance = null ;//定義初始化_instance
module.exports = function(time){ //定義單例類
    function Class(time){
    this.name = "danhuang";
    this.book = 'Node.js';
    this.time = time;
    }
    Class.prototype = {
    constructor : Class,
    show : function(){
    console.log(this.book + ' is write by ' + this.name + ', time is ' + this.time);
    }
    }
    
    this.getInstance = function(){
    if (_instance === null){
    _instance = new Class(time);
    }
    return _instance;
    }    
}

【代碼說明】:

var _instance = null : 存儲Class對象

function Class(time)和Class.prototype : 創建Class類和方法

this.getInstance = function(){} : 獲取單例對象接口。

注意,_instance變量要放在單例方法之外,否則將無法實現單例模式。原因是當調用單例方法時每次都會重新將其賦值爲null,而放在單例函數之外時,調用單例函數不會影響到_instancce變量的值。


接下來創建調用驗證single_class.js。代碼如下:

/*single_app.js*/
var Single = require('./single_class');


var singleObj1 = new Single('2012-11-10');
var singleClass1 = singleObj1.getInstance();
singleClass1.show();


var singleObj2 = new Single('2012-11-20');
var singleClass2 = singleObj2.getInstance();
singleClass2.show();

【代碼說明】

var Single = require('./single_class'); 獲取單例類

var singleObj1 = new Single('2012-11-10'); // new 一個新的單例類對象,並設置時間

var singleClass1 = singleObj1.getInstance(); //獲取Class類的對象

singleClass1.show():// 調用Class類對象的方法

【運行結果】

Node.js is write by danhuang, time is 2012-11-10
Node.js is write by danhuang, time is 2012-11-10


可以看到,SingleObj1SingleObj2是一樣的,只是在new對象的時候傳遞的時間不同。這個時間主要用來判斷是否new了新的對象。











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章