(二)js前端开发中设计模式之单例模式

单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。
利弊分析

  • 优点:

    • 单例模式可以保证内存中只有一个对象,减少了内存的开销。
    • 可以避免对资源的多重占用。
    • 方便测试,可以通过接口来控制类的实例化。
    • 避免对资源的多重占用。
  • 缺点:

    • 单例模式一般没有接口,扩展比较困难。
    • 单点访问,可能会导致模块的耦合。
  • 基本的单例模式,就是对象字面量

const SingleTon = {
  name:"tom",
  age"26",
  say(){
    console.log("hello")
  },
  eat(){
    console.log("rice")
  }
}

//访问单例
SingleTon.gender = '男'
SingleTon.say()

划分命名空间

var GianCrop = {};
GianCrop.common = {};
GianCrop.errorCodes = {};
GianCrop.pageHandler = {};

使用私有成员

  • 方式一:约定
GianCrop.dataParse = {
  //约定私有成员以_开头
  _method1() {},
  _method2() {},
  _method3() {}
  //约定公共成员不以_开头
  method1() {},
  method2() {},
  method3() {}
};

  • 方式二:闭包
// MyNameSpce.SingleTon = {}
// 闭包单例模式
let MyNameSpce = {};
MyNameSpce.SingleTon = (function () {
  return {
    name: "tom",
    age: 26,
    say() {
      console.log("hello");
    },
    eat() {
      console.log("rice");
    },
  };
})();

const name = MyNameSpce.SingleTon.name;
console.log("🚀 ~ name:", name);

增加私有成员

let MyNameSpce = {};
MyNameSpce.SingleTon = (function () {
  let isFlag = true;
  let count = 30;
  function getCount() {
    return count;
  }
  return {
    name: "tom",
    age: 26,
    say() {
      console.log("hello");
    },
    eat() {
      console.log("rice");
    },
    getFlag() {
      return isFlag;
    },
    getCount,
  };
})();

const { name, getFlag, getCount } = MyNameSpce.SingleTon;
console.log("🚀 ~ name:", name);
console.log("🚀 ~ getFlag:", getFlag());
console.log("🚀 ~ getCount:", getCount());

/**
 * 🚀 ~ name: tom
demo05.js:46 🚀 ~ getFlag: true
demo05.js:47 🚀 ~ getCount: 30
 */

惰性单例模式

let MyNameSpce1 = {};
MyNameSpce1.SingleTon = (function () {
  let singleTon = null;
  function init() {
    let isFlag = true;
    let count = 30;
    function getCount() {
      return count;
    }
    console.log("init-----------");
    return {
      name: "tom",
      age: 26,
      say() {
        console.log("hello");
      },
      eat() {
        console.log("rice");
      },
      getFlag() {
        return isFlag;
      },
      getCount,
    };
  }
  return {
    getInstance() {
      if (!singleTon) {
        singleTon = init();
      }
      return singleTon;
    },
  };
})();

const demo = MyNameSpce1.SingleTon.getInstance();
const demo2 = MyNameSpce1.SingleTon.getInstance();

console.log(demo.name);
console.log(demo2.name);

//调用了两次实例,但是只初始化了一次

/**
 *
 * 🚀 ~ name: tom
 * 🚀 ~ getFlag: true
   🚀 ~ getCount: 30
   init-----------
   tom
   tom
 */

分支

var SimpleXhrFactory = (function () {
  const standard = {
    createXhrObjec() {
      return new XMLHttpRequest();
    },
  };
  const activeXNew = {
    createXhrObject() {
      return new ActiveXObject("Microsoft.XMLHTTP");
    },
  };
  const activeOld = {
    createXhrObject() {
      return new ActiveXObject("Msxml2.XMLHTTP");
    },
  };
  var testObject;
  try {
    testObject = standard.createXhrObject();
    return standard;
  } catch (error) {
    try {
      testObject = activeXNew.createXhrObject();
      return activeXNew;
    } catch (error) {
      try {
        testObject = activeOld.createXhrObject();
        return activeOld;
      } catch (error) {
        throw new Error("can't create xhr object");
      }
    }
  }
})();

相关推荐

  1. ()js前端开发设计模式模式

    2024-07-19 04:40:04       22 阅读
  2. 前端设计模式模式

    2024-07-19 04:40:04       56 阅读
  3. (三)js前端开发设计模式工厂模式

    2024-07-19 04:40:04       19 阅读
  4. js设计模式模式

    2024-07-19 04:40:04       27 阅读
  5. (四)js前端开发设计模式工厂方法模式

    2024-07-19 04:40:04       24 阅读
  6. (四)js前端开发设计模式简单工厂模式

    2024-07-19 04:40:04       19 阅读
  7. 设计模式模式

    2024-07-19 04:40:04       55 阅读
  8. C++设计模式模式

    2024-07-19 04:40:04       55 阅读
  9. 设计模式模式

    2024-07-19 04:40:04       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 04:40:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 04:40:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 04:40:04       58 阅读
  4. Python语言-面向对象

    2024-07-19 04:40:04       69 阅读

热门阅读

  1. 深度学习落地实战:人脸五官定位检测

    2024-07-19 04:40:04       20 阅读
  2. postman接口测试工具详解

    2024-07-19 04:40:04       21 阅读
  3. 自制数据集处理

    2024-07-19 04:40:04       19 阅读
  4. layui前端开发-记录一次弹窗嵌套表格功能的开发

    2024-07-19 04:40:04       19 阅读
  5. oracle 查询锁 && 解锁

    2024-07-19 04:40:04       20 阅读
  6. 初识Redis

    2024-07-19 04:40:04       17 阅读
  7. redis setnx使用方法

    2024-07-19 04:40:04       18 阅读
  8. 微服务

    微服务

    2024-07-19 04:40:04      17 阅读
  9. perf工具学习材料

    2024-07-19 04:40:04       17 阅读
  10. opencv—常用函数学习_“干货“_3

    2024-07-19 04:40:04       16 阅读
  11. k8s学习——升级后的k8s使用私有harbor仓库

    2024-07-19 04:40:04       25 阅读
  12. LVS的DR模式

    2024-07-19 04:40:04       19 阅读
  13. 前端常用工具库

    2024-07-19 04:40:04       19 阅读
  14. 智能灯光的工作原理

    2024-07-19 04:40:04       19 阅读
  15. 安全防御:防火墙基本模块

    2024-07-19 04:40:04       21 阅读