我学会了,单例模式

简介: 单例模式属于创建型模式,这个类型的设计模式是将 对象的创建和使用解耦了,花式的去创建对象。

前言

单例模式属于创建型模式,这个类型的设计模式是将 对象的创建和使用解耦了,花式的去创建对象。

单例模式

应用场景:用于解决资源使用时的冲突问题,一般是对象创建后使用时,该实例要全局唯一。其实也可以指定数量的对象实例唯一,不一定非得只有一个,能够区分边界就行,能够对边界区分隔离,就能解决资源使用时冲突的问题。单例模式中对象创建的方式有两种,一种是预加载,另一种是懒加载。

理解:对象的创建和使用解耦了,单例模式适用于使用对象时资源冲突的问题,比如所有资源都已经放入一个对象中缓存住了,下一次如果使用这个缓存的对象就会非常的方便,否则使用一个重新创建的崭新对象,就会丢失之间的数据记录,造成系统不稳定,就像你已经登录过了,假使你之后的每一次操作都要再进行登录,那用户会觉得很烦恼。预加载就像点击一个APP后自动进行登录,而懒加载像是你点击APP后,APP登录界面的账号密码都已经自动填上了,只需要你点击一下登录按钮。

namespace creative_mode_05 {

    // 登录功能接口
    interface Loginable {
        login(): void
    }

    // 产品类,懒加载
    class LoginForm implements Loginable {

        // 唯一的实例和构造函数都上锁
        private static instance?: LoginForm
        private constructor() { }
      
        login(): void {
            console.log('1.登录成功')
        }

        static getLoginInstance(): LoginForm {

            if (this.instance) {
                return this.instance
            }

            return this.instance = new LoginForm()
        }
    }

    // 产品类 预加载
    class LoginForm2 implements Loginable {

        // 唯一的实例和构造函数都上锁
        private static instance: LoginForm2 = new LoginForm2()
        private constructor() { }
      
        login(): void {
            console.log('2.登录成功')
        }

        static getLoginInstance(): LoginForm2 {
            return this.instance
        }
    }

    // 使用1
    const loginFormInstance = LoginForm.getLoginInstance() // 实例创建的时机在第一次获取实例时,第一次获取才会创建,
    loginFormInstance.login()

    // 使用2
    const loginForm2Instance = LoginForm2.getLoginInstance() // 实例创建的时机在这个LoginForm2的class被加载时
    loginForm2Instance.login()
}
目录
相关文章
|
JavaScript
vue中使用aplayer插件做一个网页音乐播放器
vue中使用aplayer插件做一个网页音乐播放器
810 0
|
11月前
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
396 57
|
8月前
|
缓存 应用服务中间件 Apache
HTTP 范围Range请求
HTTP范围请求是一种强大的技术,允许客户端请求资源的部分内容,提高了传输效率和用户体验。通过正确配置服务器和实现范围请求,可以在视频流、断点续传下载等场景中发挥重要作用。希望本文提供的详细介绍和示例代码能帮助您更好地理解和应用这一技术。
527 19
|
Java 应用服务中间件 Linux
JVM调优总结(一)之参数配置说明与实例
JVM调优总结(一)之参数配置说明与实例
1148 0
|
关系型数据库 MySQL 索引
mysql8.0中fulltext不能查询到中文的解决方法
确保MySQL服务器字符集为`utf8mb4`,并设置`ngram_token_size=1`以支持单字搜索。如已更改此参数且存在全文索引,需删除原有索引并重建,使用`WITH PARSER ngram`指定解析器。例如: ``` ALTER TABLE your_table DROP INDEX idx_fulltext, ADD FULLTEXT INDEX idx_fulltext (your_column) WITH PARSER ngram; ```
|
开发框架 前端开发 API
基于SqlSugar的开发框架循序渐进介绍(26)-- 实现本地上传、FTP上传、阿里云OSS上传三者合一处理
基于SqlSugar的开发框架循序渐进介绍(26)-- 实现本地上传、FTP上传、阿里云OSS上传三者合一处理
|
11月前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
709 0
|
数据采集 Java Linux
Java异常之【sun.security.validator.ValidatorException: PKIX path building failed: sun.security...】
Java异常之【sun.security.validator.ValidatorException: PKIX path building failed: sun.security...】
485 0
Java异常之【sun.security.validator.ValidatorException: PKIX path building failed: sun.security...】
|
JavaScript 前端开发
vue页面滚动动画——wow.js教程
vue页面滚动动画——wow.js教程
386 0
|
Java Spring
深入理解Spring Boot中的Profile配置
深入理解Spring Boot中的Profile配置