javascript设计模式:单例模式(Singleton)


定义

保证一个特定类仅有一个实例。如果第二次使用同一个类创建新对象的时候,应该得到与第一次所创建对象完全相同的对象


补充知识

自执行函数

    (function Fun(){
        console.log('work!');
    })();
    // Output: work!
  • 讲解
    //相当于是先
    let tmp = function Fun(){
        console.log('work!');
    }
    //然后
    tmp();
    //Output: work!

就是把tmp换为声明的函数,省去了声明另一个变量的步奏。


arguments

ECMAScript函数中的参数在内部用一个对象来表示。函数接收的始终是这个对象,而不关系数组中所包含的参数(如果有参数的话)

    function A(){
        console.log(arguments);
    }
    A(1,2,3,4,5,6,7,8,9,10);

Output:
javascript设计模式:单例模式(Singleton)_第1张图片


基本格式

'use strict';
    let mySingleton = (function(){
        //变量instance用于标记存放具体方法的init()函数是否被初始化,并在初始化后用于存放init()
        let instance;

        //方程init()内部填写具体实现方法,不希望对外暴露与修改的写在函数内部,可以被外部调用与修改的写在返回值中
        function init() {
            //函数privateMethod()不可被外部调用,为私有元素
            function privateMethod() {
                console.log('Private Method');
            }
            //变量privateVar的值不可被外获取与修改,为私有元素
            let privateVar = 'Private var';
            return {
                //变量publicVar可被外部获取与修改
                publicVar: 'Public publicVar',
                //函数publicFunction可被外部获取与修改
                publicFunction: function() {
                    console.log('Public Method');
                    }
                };
            }

            return {
                //此函数的作用为需要使用init()中具体方法时判断其是否被初始化
                getInstance: function() {
                    if(instance === undefined){
                    //如果没有被初始化,则进行初始化
                        instance = init();
                    }
                    //返回存放具体方法的init()函数
                    return instance;
                }
            };
        })();

//测试
let A = mySingleton.getInstance();
let B = mySingleton.getInstance();
console.log(A === B);     //Output: true , 说明完全相同,符合定义:指向单一对象
console.log(A.publicVar); // Output: Public publicVar(可访问)
A.publicFunction();       //Output: Public Method(可访问)
A.privateMethod();        //Output: TypeError: A.privateMethod is not a function(不可访问)
console.log(A.privateVar);//Output: undefined(不可访问)

参考与推荐阅读

  • 深入理解javascript系列之单例模式
  • Learning Javacript Design Patterns
  • 《Javascript模式》

你可能感兴趣的:(javascript,软件设计,javascript,设计模式)