码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript设计模式与开发实践-读书笔记(4)单例模式

时间:2016-10-07 17:52:43      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

1.实现单例模式

要实现一个标准的单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象。

    var Singleton = function(name){
        this.name = name;
        this.instance = null;
    };
    Singleton.prototype.getName = function(){
        alert(this.name);
    };
    Singleton.getInstance = function(name){
        if(!this.instance){
            this.instance = new Singleton(name);
        }
        return this.instance;
    };
    var a = Singleton.getInstance(‘sven1‘);
    var b = Singleton.getInstance(‘sven2‘);
    alert(a === b);  //true

或者:

    var Singleton = function(name){
        this.name = name;
    };
    Singleton.prototype.getName = function(){
        alert(this.name);
    };
    Singleton.getInstance = (function(){
        var instance = null;
        return function(name){
            if(!instance){
                instance = new Singleton(name);
            }
            return instance;
        }
    })();
    var a = Singleton.getInstance(‘sven1‘);
    var b = Singleton.getInstance(‘sven2‘);
    alert(a === b);  //true

我们通过Singleton.getInstance来获取Singleton类的唯一对象,这种方式相对简单,但是有一个问题,增加了这个类的"不透明性"。
这段单例模式代码的意义并不大。

 

2.透明的单例模式

我们现在的目标是实现一个"透明"的单例类,用户从这个类中创建对象的时候,可以像使用其他任何普通类一样。

var CreateDiv = (function(){
        var instance;
        var CreateDiv = function(html){
            if(instance){
                return instance;
            }
            this.html = html;
            this.init();
            return instance = this;
        };

        CreateDiv.prototype.init = function(){
            var div = document.createElement(‘div‘);
            div.innerHTML = this.html;
            document.body.appendChild(div);
        };

        return CreateDiv;

    })();

    var a = new CreateDiv(‘sven1‘);
    var b = new CreateDiv(‘sven2‘);
    alert(a === b);  

但它同样有一些缺点。
CreateDiv的构造函数实际上负责了两件事情。第一是创建对象和执行初始化方法init方法,第二是保证只有一个对象。违背了"单一职责原则"。

 

3.用代理实现单例模式

技术分享
    var CreateDiv = function(html){        
        this.html = html;
        this.init();
    };

    CreateDiv.prototype.init = function(){
        var div = document.createElement(‘div‘);
        div.innerHTML = this.html;
        document.body.appendChild(div);
    };
    //引入代理类
    var ProxySingletonCreateDiv = (function(){
        var instance;
        return function(html){
            if(!instance){
                instance = new CreateDiv(html);
            }
            return instance;
        }
    })();

    var a = new ProxySingletonCreateDiv(‘sven1‘);
    var b = new ProxySingletonCreateDiv(‘sven2‘);
    alert(a === b);
View Code

 

JavaScript设计模式与开发实践-读书笔记(4)单例模式

标签:

原文地址:http://www.cnblogs.com/6489c/p/5936280.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!