单例模式

1 单例模式

定义:是能被实例化一次的类或者对象(只能存在一个)
特点:
只允许实例化一次的对象类
对于十分复杂的对象类,往往可以节省资源占用
通常也被用来管理命名空间
作用:管理命名空间,管理数据,方法的存储
应用:
一些代码库中命名空间就是通过单例模式实现的
管理数据的存储,例如模拟静态变量

    <script>
        // 定义,只能实例化一次
        // 有时候不允许外界访问
        // 放在闭包中
        var single = (function() {
            // 定义类
            function Demo() {
                console.log('实例化了');
                this.msg = 'hello';
                // 省略1万行
            }
            // 方法
            Demo.prototype.getMsg = function() {
                console.log(this.msg);
            }
            // 省略1万行
            // 存储类实例化对象
            var instance = new Demo();
            // 暴露接口
            return function() {
                // 返回实例
                return instance;
            };
        })()
		 程序执行的时候会实例化一次,并且存储在instance中,并把函数function(){return instance}返回给single
		然后执行single的时候var s1 = single();,会把实例化后的对象返回给s1
        var s1 = single();
        var s2 = single();
        console.log(s1, s2);
    </script>

上面这种单例模式在程序开始执行的时候就会实例化一次,下面这种方式,只有在执行var s1 = single();的时候才会实例化

2 惰性单例

定义:延迟单例类的实例化时间
作用:如果单例类实例化开销很大,页面加载时候,有很多业务逻辑需要执行,并不需要这个单例类,此时我们可以推迟这个单例类的实例化时间
实现:
1 通过闭包将惰性类封闭起来,避免外界的访问
2 在闭包的返回函数中,我们判断闭包类有没有实现
没有实现再去实例化
实现了直接返回
3 当调用这个闭包时候,才尝试去实例化,这样就拖延了实例化的时间点

    <script>
        // 定义,只能实例化一次
        // 有时候不允许外界访问
        // 放在闭包中
        var single = (function() {
            // 定义类
            function Demo() {
                console.log('实例化了');
                this.msg = 'hello';
                // 省略1万行
            }
            // 方法
            Demo.prototype.getMsg = function() {
                console.log(this.msg);
            }
            // 定义单例
            var instance;
            // 暴露接口
            return function() {
                // 判断单例是否被实例化了
                if (instance) {
                    return instance;
                } else {
                    // 重新实例化并返回
                    只有执行single();的时候并且没有被实例化过的时候才会实例化一次
                    instance = new Demo();
                    return instance;
                }
            };
        })()

        var s1 = single();
        var s2 = single();
        console.log(s1, s2);
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值