单例模式

Posted mengxiangji

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

介绍

在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为。比如在整个系统的配置文件中,配置数据有一个单例对象进行统一读取和修改,其他对象需要配置数据的时候也统一通过该单例对象来获取配置数据,这样就可以简化复杂环境下的配置管理。--摘自维基百科

核心

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    class Singleton
        constructor(name) 
            this._name = name;
            this._instance = null;
        
        getName() 
            console.log(this.name)
        
        static getInstance() 
            if(!this._instance)
                this._instance = new Singleton();
            
            return this._instance;
        
    
    let _a = Singleton.getInstance('a');
    let _b = Singleton.getInstance('b');

通过闭包的形式创建单例模式,同时符和惰性单例的特性

    let Singleton = function(name) 
        this._name = name;
    ;

    Singleton.prototype.getName = function() 
        console.log(this._name)
    ;
    Singleton.getInstance = (function(name) 
        let _instance;
        return function(name)
            if (!_instance) 
                _instance = new Singleton(name);
            
            return _instance;
        
    )();

    let _a = Singleton.getInstance('a');
    let _b = Singleton.getInstance('b');
    console.log(_a == _b);   //true

引入代理实现单例模式

        class CreateDiv 
            constructor (html)
                this._html = html;
                this.init()
            
            init()
                let _div = document.createElement('div');
                _div.innerHTML  = this._html;
                document.body.appendChild(_div);
            
        
        let _ProxyCreateDiv = (function()
            let _instance;
            return function(html)
                !_instance && (_instance = new CreateDiv(html))
                console.log(_instance)
            
            return _instance;
        )()
        let _a = new _ProxyCreateDiv('a');
        let _b = new _ProxyCreateDiv('b');

负责管理单例模式的逻辑移到了代理类_ProxyCreateDiv中。这样一来,CreateDiv就变成了一个普通的类,他跟_ProxyCreateDiv组合起来可以达到单例模式的效果

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块