• 单例模式及应用场景


    如果希望自己的代码更优雅、可维护性更高以及更简洁,往往离不开设计模式这一解决方案。

    JS设计模式中,最核心的思想:封装变化(将变与不变分离,确保变化的部分灵活,不变的部分稳定)。

    那么来说说第一个常见的设计模式:单例模式

    单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问方式,为了解决一个全局使用的类频繁被创建和销毁、占用内存的问题。

     比如,当系统中某个接口的结构已经无法满足我们现在的业务需求,但又不能改动这个接口,因为可能原来的系统很多功能都依赖于这个接口,改动接口会牵扯到太多文件。因此应对这种场景,我们可以很快地想到可以用适配器模式来解决这个问题。 下面介绍几种在JavaScript中常见的几种设计模式:

    1、单例模式

    单例模式的定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现的方法为先判断实例存在与否,如果存在则直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。 适用场景:一个单一对象。比如:弹窗,无论点击多少次,弹窗只应该被创建一次。

    1. class CreateUser {
    2. constructor(name) {
    3. this.name = name;
    4. this.getName();
    5. }
    6. getName() {
    7. return this.name;
    8. }
    9. }// 代理实现单例模式
    10. var ProxyMode = (function() {
    11. var instance = null;
    12. return function(name) {
    13. if(!instance) {
    14. instance = new CreateUser(name);
    15. }
    16. return instance;
    17. }})();// 测试单体模式的实例
    18. var a = new ProxyMode("aaa");
    19. var b = new ProxyMode("bbb");// 因为单体模式是只实例化一次,所以下面的实例是相等的console.log(a === b); //true

     ES5通过闭包 

    在ES5中,可以使用闭包(函数内部返回函数被外界变量所引用,导致这个函数里面的变量无法被释放,就构建成闭包)来保存这个类的实例。

    1. var Singeton = (function(){
    2. var instance;
    3. function User(name,age){
    4. this.name=name;
    5. this.age=age;
    6. }
    7. return function(name,age){
    8. if(!instance){
    9. instance = new User(name,age)
    10. }
    11. return instance
    12. }
    13. })()

     此时这个实例一旦生成,每次都是返回这个实例,且不会被修改,可以看到下面的代码,当给 User 对象初始赋值 name:alice,age:18 时,以后再赋值便无效了,以及每次返回都是初始的实例对象。

    ES6中使用类的静态属性

    以上代码使用ES6语法来实现,通过类的静态属性来保存唯一的实例对象。

    1. class Singeton {
    2. constructor(name,age){
    3. if(!Singeton.instance){
    4. this.name = name;
    5. this.age = age;
    6. Singeton.instance = this;
    7. }
    8. return Singeton.instance;
    9. }
    10. }

     创建方式仍然是一样的,通过 new 关键字创建类的实例对象。

    案例

    那这样一种设计模式在开发中实际有什么用途呢?我们试想这样一个业务场景:访问网站时,很久没有操作页面,此时授权过期,当我们点击页面上的任何一个地方,都会弹出一个登录框。

    那么这个登录框,是全局唯一的,不会存在多份,也不会互相冲突,所以不需要每次都创建一份,保留初始那一份就够了。

    JavaScript设计模式之单例模式应用场景案例详解_JavaScript_脚本之家

  • 相关阅读:
    从零开始学习Linux(1)
    LeGO-LOAM
    我的创作纪念日——2048天
    grid新建主从一对多
    Minecraft 1.18.1、1.18.2模组开发 16.种植作物(crop)
    Spring5应用之AOP概念详解
    迅速了解JDK线程池以及Spring线程池
    【Python+Selenium学习系列4】Selenium常用的方法
    aosp定制android系统
    算法 矩阵最长递增路径-(递归回溯+动态规划)
  • 原文地址:https://blog.csdn.net/qq_40055200/article/details/136437056