JavaScript设计模式-单例模式(3)

简介: JavaScript设计模式-单例模式(3)

单例模式又称单体模式,单例模式指的是一个构造函数一生只能有一个实例对象,无论对构造函数使用多少次new关键字,都只会有一个实例

单例模式的应用场景


单例设计模式的应用场景,比如应用自定义弹出层和登录框

非单例模式


// 声明一个构造函数 
    function Structure(){
       this.num=1;
    }
    // 使用new关键字创建实例
    let a=new Structure();
    let b=new Structure();
    // 对比俩个实例是否相等
    console.log(a===b);

此时通过new关键字创建的俩个实例不相等,是因为通过new关键字创建出来的是一个对象,对象之间对比的是内存地址,a和b是俩个实例,内存地址不一样,所以不相等

这个在一般情况下是我们所期望的,但是在某些时候,我们期望他们共用一个实例

单例模式


我们在某些特殊场景,只希望共用一个实例,我们在创建实例时,先去看看该构造函数是否创建过实例,创建过实例的情况下,就读取缓存下来的实例对象并返回,如果没有创建就直接创建并缓存下这个对象,这里的重点就在第一次缓存下来的对象

//我们这里需要声明一个变量,用于实例创建第一次时候的缓存
        let _unicode = null;
        // 创建函数
        function Structure() {
   // 判断_unicode是否为null,为null就是第一次创建,需要赋初始值在返回,不为null就直接返回当前的_unicode
            if (_unicode == null) {
                // 初始值
                _unicode = {
                    num: 1
                }
            }
            // 返回
            return _unicode;
        }
        let a = Structure();
        let b = Structure();
        console.log(a===b);

这个时候a和b都已经相等了,因为创建构造函数的时候,都会去查看当前缓存的对象是否存在,存在即返回,不存在则创建完进行缓存,这样就会让他们使用的都是同一个内存地址

这里还存在一个问题,就是a创建完,在创建b之前对缓存对象进行修改,就会导致a和b是不同的存储位置,也会造成不相等的情况,这样不安全,我们现在要进行修改,我们这里可以通过闭包的方式把缓存对象变成私有属性,外部无法修改

let Structure = ( // 创建函数
            function () {
                //缓存对象
                let _unicode = null;
                // 返回一个函数行成闭包作用域
                return function () {
                    if (_unicode == null) {
                        // 初始值
                        _unicode = {
                            num: 1
                        }
                    }
                   return _unicode;
                }
            })();
        let a = new Structure();
        let b = new Structure();
        console.log(a === b);

通过闭包的特性,实现了私有化属性,如果在a创建完,b创建之前去修改缓存对象,将会报错,因为缓存对象属于构造函数私有的,我们外部访问不到,这样就杜绝了能够在外部修改缓存对象,创建多个实例的问题,目前由于采用了闭包,缓存对象在私有化作用域中,所以无法通过外部修改,a和b存储数据的位置也不会发生更改,这样就实现了一个单例模式

坚持努力,无惧未来!

相关文章
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
558 15
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
218 2
|
设计模式 安全 Java
设计模式:单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。它通过私有化构造函数、自行创建实例和静态方法(如`getInstance()`)实现。适用于数据库连接池、日志管理器等需要全局唯一对象的场景。常见的实现方式包括饿汉式、懒汉式、双重检查锁、静态内部类和枚举。线程安全问题可通过`synchronized`或双重检查锁解决,同时需防止反射和序列化破坏单例。优点是避免资源浪费,缺点是可能增加代码耦合度和测试难度。实际开发中应优先选择枚举或静态内部类,避免滥用单例,并结合依赖注入框架优化使用。
|
设计模式 JavaScript 算法
浅谈几种js设计模式
设计模式是软件开发中的宝贵工具,能够提高代码的可维护性和扩展性。通过单例模式、工厂模式、观察者模式和策略模式,我们可以解决不同场景下的实际问题,编写更加优雅和高效的代码。
465 8
|
设计模式 存储 安全
设计模式2:单例模式
单例模式是一种创建型模式,确保一个类只有一个实例,并提供全局访问点。分为懒汉式和饿汉式: - **懒汉式**:延迟加载,首次调用时创建实例,线程安全通过双重检查锁(double check locking)实现,使用`volatile`防止指令重排序。 - **饿汉式**:类加载时即创建实例,线程安全但可能浪费内存。 示例代码展示了如何使用Java实现这两种模式。
436 4
|
设计模式 存储 安全
设计模式-单例模式练习
单例模式是Java设计模式中的重要概念,确保一个类只有一个实例并提供全局访问点。本文详解单例模式的核心思想、实现方式及线程安全问题,包括基础实现(双重检查锁)、懒汉式与饿汉式对比,以及枚举实现的优势。通过代码示例和类图,深入探讨不同场景下的单例应用,如线程安全、防止反射攻击和序列化破坏等,展示枚举实现的简洁与可靠性。
340 0
|
设计模式 存储 前端开发
前端必须掌握的设计模式——单例模式
单例模式是一种简单的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。适用于窗口对象、登录弹窗等场景,优点包括易于维护、访问和低消耗,但也有安全隐患、可能形成巨石对象及扩展性差等缺点。文中展示了JavaScript和TypeScript的实现方法。
824 13
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
287 2
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
347 4
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
386 2