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了新的对象。











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值