Javascript 设想形式 -- Singleton(单例)形式

从典范意义上来讲

Singleton形式,在该实例不存在的情况下,能够经由过程一个要领建立一个类来完成建立类的新实例;假如实例已存在,它会简朴返回该对象的援用。Singleton不同于静态类,由于我们能够推延他们的初始化。

var mySingleton = (function() {

    var instance;

    function init() {

        function privateMethod() {
            console.log("i am private");
        }

        var privateVariable = "i am also private";

        var privateRandomNumber = Math.random();

        return {
            publickMethod: function () {
                console.log("the public can see me");
            },

            publicProperty: "i am also public",

            getRandomNumber: function () {
                return privateRandomNumber;
            }
        };
    };

    return {
        getInstance: function() {
            if (!instance) {
                instance = init();
            }
            return instance;
        }
    };
}) ();

var myBadSingleton = (function() {
    var instance;
    function init() {
        var privateRandomNumber = Math.random();
        return {
            getRandomNumber: function() {
                return privateRandomNumber;
            }
        };
    };
    return {
        getInstance: function() {
            instance = init();
            return instance;
        }
    };
})();

var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
console.log(singleA.getRandomNumber());
console.log(singleB.getRandomNumber());
console.log(singleA.getRandomNumber() === singleB.getRandomNumber());            // true

console.log("\n");

var badSingleA = myBadSingleton.getInstance();
var badSingleB = myBadSingleton.getInstance();
console.log(badSingleA.getRandomNumber());
console.log(badSingleB.getRandomNumber());
console.log(badSingleA.getRandomNumber() === badSingleB.getRandomNumber());      // false

Singleton形式的适用性形貌以下:
1、当类只能有一个实例而且客户能够从一个尽人皆知的接见点接见它时。
2、该唯一的实例应当是经由过程子类化可扩大的,而且客户应当无须要改代码就可以运用一个扩大的实例。

在实践中

var SingletonTester = (function() {
    function Singleton( options ) {
        options = options || { };
        this.name = "SingletonTester";
        this.pointX = options.pointX || 6;
        this.pointY = options.pointY || 10;
    }
    var instance;
    var _static = {
        name: "SingletonTester",
        getInstance: function ( options ) {
            console.log(instance + "\n");
            if ( instance === undefined ) {
                instance = new Singleton( options );
            }
            return instance;
        }
    };
    return _static;
})();

var test1 = SingletonTester.getInstance({pointX: 15});
console.log(test1);

console.log("\n");

var test2 = SingletonTester.getInstance({pointX: 7});
console.log(test2);

效果如图:
《Javascript 设想形式 -- Singleton(单例)形式》

    原文作者:西山雨
    原文地址: https://segmentfault.com/a/1190000002434245
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞