初中级高薪必背!!设计模式-单例模式(短小精悍,易食用)

73 阅读1分钟

设计模式-单例模式

(几个例子很简单的,20分钟速通,快一点的10分钟

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

思考?!

假如有个东西,每次都需要反复创建销毁,这会不会浪费资源,有必要每次都新建吗(单例模式的诞生

下面用三个例子尝试瞎写单例模式

茫然不知所措.webp

第一种
  /** 符合单例模式,但是不符合开闭原则,因为instance暴露了**/
        function Test(name) {
          // 1.正常new走的逻辑
          // var this =Object.create(Test.prototype)
          // return this

          //2.单例模式
          if (Test.instance) {
            // 返回了对象就不返回this了
            return Test.instance;
          }
          
          this.name = name;
          Test.instance = this;
        }
        var a = new Test("one");
        //   暴露了修改了就是false了 不符合开闭原则
        //   Test.instance={}
        var b = new Test();

        console.log(a === b);
第二种 利用闭包

      function Test(name) {
          var instance = this;
          this.name = name;
          Test = function () {
            return instance;
          };
        }

        var a = new Test();
        // 这里都是给闭包的那个Test原型上加属性,但是我们new 的时候都是new 外面的那个Test
        Test.prototype.lastName = "马龙";
        var b = new Test();
        var c = new Test();

        console.log(b.lastName); // undefined
        console.log(c.lastName);// undefined
        console.log(a.lastName);// undefined

        console.log(a === b, b === c);
第三种 也叫圣杯模式

1.跟第一种做对比,利用了闭包,符合开闭原则

2.跟第二种做对比,利用的是里面的函数作为构造函数

     var Test = (function () {
          var instance;
          return function (name) {
            if (typeof instance === "object") {
              return instances;
            }

            instance = this;
            this.name = name;
          };
        })();
最后,浓缩精华,尝试写一个让方法能改变其成为单例模式
     var getSingle = function (func) {
          var result;
          return function () {
            if (!result) {
              result = func.apply(this, arguments);
            }
            return result;
         };
      };
      // 心里活动:perfect,也不是多难嘛

就你,别看了,快点赞收藏,完结撒花了

完结撒花.webp