代码改变世界

js设计模式--单体模式

2013-09-16 15:48  明朝  阅读(242)  评论(0编辑  收藏  举报

 

GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自《松本行弘的程序世界》).

单体模式:

  单体(Singleton)模式的思想在于保证一个特定类仅有一个实例。当在第二次使用同一个类创建新对象的时候,和第一次创建对象完全相同对象。

  当使用new语法通过构造函数来创建对象,仅仅获得的是指向完全相同的对象的新指针:

  例:

function uniFn(){};

var uni1 = new uniFn();

var uni2 = new uniFn();

uni1.constructor === uni2.constructor; //true  指向的是同一个构造函数

  使用对象字面量创建一个单体:

var obj = {
   
   first:"单体",
   two:function(){}  
          
};

  js中是没有类的概念,只有对象。当创建一个新对象的时,实际上没有其他对象与其类似,新对象已经是单体了。

var obj1 = {
   
   first:"单体",

   two:function(){}  
          
};

var obj2 = {
   
   first:"单体",

   two:function(){}  
          
};

obj1 == obj2; //false   即便是创建完全相同成员的同类对象,他们也是不想等的。
obj1 === obj2; //false

 通过闭包实现单体的方法,这个秘诀在与重写构造函数:

function example(){

  //缓存实例   
var instans = this;     this.name = "_this";
  //重写构造函数   example
= function(){ return instans; }; }; var exa = new example(); var exa2 = new example(); console.log(exa == exa2); //true console.log(exa == exa2);//true

 如果需要使原型和构造函数指针按照预期的那样运行,可以通过调整实现这个目标:

function example(){

  //缓存实例   
  var instans;

  //重写构造函数
  example = function(){ return instans; };
    //保留原型属性
    example.prototype = this;
    //实例
    instans = new example();
    //重置构造函数指针
    instans.constructor = example;

    //功能

     this.name = "_this";
    return instans;
};

example.prototype.nothing = true;

var exa = new example();

example.prototype.evething = true;

var exa2 = new example();

console.log(exa === exa2);  //true

//所有属性都起作用

console.log(exa.nothing && exa2.evething && exa.nothing && exa2.evething);  //true

//构造函数的指针

console.log(exa.constructor === example) //true

 

 

理解的并不够深刻,总结一遍,加强不少印象。

参考《javascript模式》

腾讯web前端团队:http://www.alloyteam.com/2012/10/common-javascript-design-patterns/