• JS设计模式应用(单例模式学习笔记)


    单例模式

    单例就是保证一个类只有一个实例,实现方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。

    单例模式的思路:

    一个类能返回一个对象的引用(并且永远是同一个)和一个获得该实例的方法(静态方法,通常使用 getInstance 名称)。那么当我们调用这个方法时,如果类持有的引用不为空就返回该引用,否者就创建该类的实例,并且将实例引用赋值给该类保持的那个引用再返回。同时将该类的构造函数定义为私有方法,避免其他函数使用该构造函数来实例化对象,只通过该类的静态方法来得到该类的唯一实例

    我们先理解什么是单例模式,不看那些又臭又长乱七八糟.....的专业词汇,就普通大白话的去理解。

    单例模式的定义是:保证一个类仅有一个一个实例,并提供一个访问它的全局访问点。

    单例模式能在合适的时候创建对象,并且创建唯一的一个。
    代码接近于生活,很有意思。比如一个网站的登录,点击登录后弹出一个登录弹框,即使再次点击,也不会再出现一个相同的弹框。又或者一个音乐播放程序,如果用户打开了一个音乐,又想打开一个音乐,那么之前的播放界面就会自动关闭,切换到当前的播放界面。这些都是单例模式的应用场景。

    单例模式的实现

     es5实现方式

    var Singleton = function(name) {
        this.name = name;
        //一个标记,用来判断是否已将创建了该类的实例
        this.instance = null;
    }
    // 提供了一个静态方法,用户可以直接在类上调用
    Singleton.getInstance = function(name) {
        // 没有实例化的时候创建一个该类的实例
        if(!this.instance) {
            this.instance = new Singleton(name);
        }
        // 已经实例化了,返回第一次实例化对象的引用
        return this.instance;
    }

     

    es6实现方式

    创建Singleton类。class关键字和静态函数都是es6新增的。

    class Singleton {
        constructor(name) {
            this.name = name;
            this.instance = null;
        }
        // 构造一个广为人知的接口,供用户对该类进行实例化
        static getInstance(name) {
            if(!this.instance) {
                this.instance = new Singleton(name);
            }
            return this.instance;
        }
    }

    应用场景

    1.Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗?

    2.windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例

    3.应用程序的日志应用,一般都用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加

    4.Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源

    5.数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,用单例模式来维护,就可以大大降低这种损耗

    单例模式应用的场景一般发现在以下条件下:

      (1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。

      (2)控制资源的情况下,方便资源之间的互相通信。如线程池等。

  • 相关阅读:
    在k8s上部署第一个php应用
    在k8s中的基本概念
    kubernetes 环境搭建
    docker搭建私有仓库
    mysql导入数据乱码的解决
    代码单词
    让代码更容易读
    docker中的link
    docker基本
    解决无法将“babel”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  • 原文地址:https://www.cnblogs.com/geekjsp/p/12363884.html
Copyright © 2020-2023  润新知