js设计模式之单例模式

单例模式是一种设计模式,确保一个类只有一个实例并提供全局访问点。在JavaScript中,可以通过对象字面量、闭包等方式实现。惰性创建单例是在首次使用时初始化。这种模式常用于系统间的通信协调,如在模块化和资源管理中。
摘要由CSDN通过智能技术生成

单例模式

单例模式(Singleton):又被称为单体模式,是只允许实例化一次的对象类,即保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在就直接返回,不存在则创建了再返回实例,这就确保了一个类只有一个实例对象。有时我们也使用一个对象来规划一个命名空间。

在javascript里,实现单例的方法有很多种,其中最简单的一个方式是使用对象字面量的方法: 

var mySingleton = {
    property1: "something",
    property2: "something2",
    method1: function () {
        console.log("method1");
    }
};

如果以后要拓展该对象,你可以添加自己的私有属性和方法,然后使用闭包在其内部封装这些变量和函数声明,只暴露你想要的:

var mySingleton = function () {
    /* 声明私有变量和方法*/
    var privateVar = "something private";
    function showPrivate () {
        console.log(privateVar);
    }

    /* 公有变量和方法*/
    return {
        publicMethod: function () {
            showPrivate();
        },
        publicVar: 'public variable'
    }
};

var single = mySingleton();
single.publicMethod();             // something private
console.log(single.publicVar);     // public variable

如果我们只有在使用的时候才初始化,那应该怎么做呢?

var Singleton = (function() {
    var instance = null;
    function init() {
        /* 定义单例代码 */
        return {
            publicMethod: function () {
                console.log("public method");
            },
            publicProperty: 'public property'
        }
    }
    return {
        getInstance: function () {
            if (!instance) {
                instance = init();
            }
            return instance;
        }
    }
})();

/* 调用公有的方法来获取实例*/
Singleton.getInstance().publicMethod();    // public method

这种方法也被称为“惰性创建”。

使用场景:

一般是用在系统间各种模式的通信协调上。

var SingletonTester = (function () {
    function Singleton (args) {
        args = args || {};
        this.name = "SingletonTester";
        this.pointX = args.pointX || 1;
        this.pointY = args.pointY || 1;
    }
    // 实例容器
    var instance;
    var _static = {
        name: 'SingletonTester',
        // 获取实例的方法
        getInstance: function (args) {
            if (instance === undefined) {
                instance = new Singleton(args);
            }
            return instance;
        }
    }
    return _static;
})();

var singletonTest = SingletonTester.getInstance({ pointX: 3});
console.log(singletonTest.pointX);    // 3

参考资料:

https://addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript

设计模式之单例模式

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值