当前位置: 首页 > article >正文

23种设计模式之单例模式

目录

什么是单例模式

单例模式的优点 

创建单例模式的三大要点 

单例模式的实现方式

饿汉模式 

懒汉模式

使用场景


什么是单例模式

单例模式是一种创建型设计模式,它的核心思想是保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。

什么是只有一个实例?

就是在整个应用程序中,只存在该类的一个实例对象,而不是创建多个相同类型的对象。

单例模式的优点 

  1. 全局控制:保证只有一个实例,这样就可以严格的控制用户怎样访问它何时访问它;
  2. 节省资源:只有一个实例存在,避免多次创建相同的对象,从而节省了系统资源;
  3. 提高性能:单例模式可以实现懒加载,只有在需要的时候才进行实例化。

创建单例模式的三大要点 

  1. 私有的构造函数:防止外部代码直接创建类的实例
  2. 私有的静态变量:保证该类的唯一实例
  3. 公有的静态方法:通过这个公有的静态方法来获取实例(全局访问点)

单例模式的实现方式

饿汉式:在类加载时就已经完成了实例的创建,不管后面创建的实例有没有使用,先创建再说。

懒汉式: 只有在请求实例时才会创建,如果首次请求时还没创建,就创建一个新的实例,如果已经创建了就返回已有的实例。

优缺点比较:

  • 饿汉模式在刚开始就创建了实例,不存在线程安全问题,但是有可能创建的实例一直没用,会造成资源浪费;
  • 懒汉模式只有在请求的时候才会创建不存在资源浪费,但是如果有多个线程同时访问getInstance()并且同一时刻检测到没有创建实例,就可能会同时创建实例,违背了单例模式,可以用互斥锁来解决。

饿汉模式 

//饿汉模式:在类加载的时候就创建实例,可能会没有使用而造成资源浪费
public class Singleton_e {
//    私有的静态实例变量
    private static final Singleton_e instance=new Singleton_e();
    private Singleton_e(){
//        私有的构造方法
    }
//    公有的静态访问方法
    public static Singleton_e getInstance(){
        return instance;
    }
}

懒汉模式

public class Singleton_l {
//     懒汉模式:在请求实例的时候才会创建
//    私有的静态变量
    private static Singleton_l instance;
//    私有的构造方法
    private Singleton_l(){

    }
//    公有的静态方法
//    使用双重校验锁来确保线程安全
    public static Singleton_l getInstance(){
        if(instance==null){
            synchronized (Singleton_l.class){
                if(instance==null){
                    return new Singleton_l();
                }
            }
        }
        return instance;
    }
}

使用场景

1. 资源共享
多个模块共享某个资源的时候,可以使⽤单例模式,⽐如说应⽤程序需要⼀个全局的配置管理器来存储和管理配置信息。
2. 只有⼀个实例
当系统中某个类只需要⼀个实例来协调⾏为的时候,可以考虑使⽤单例模式, ⽐如说管理应⽤程序中的缓存,确保只有⼀个缓存实例,避免重复的缓存创建和管理。
3. 懒加载
如果对象创建本身就⽐较消耗资源,⽽且可能在整个程序中都不⼀定会使⽤,可以使⽤单例模式实现懒加载。

http://www.kler.cn/a/232060.html

相关文章:

  • leetcode面试 150题之 三数之和 复刷日记
  • FreeSWITCH chat 得到的是 Error! Message Not Sent
  • Excel使用-弹窗“此工作簿包含到一个或多个可能不安全的外部源的链接”的发生与处理
  • linux企业中常用NFS、ftp服务
  • 什么是PostgreSQL,有什么特点
  • 第三百二十三节 Java线程教程 - Java同步器
  • Java+微信小程序实现智慧家政系统 JAVA+Vue+SpringBoot+MySQL
  • JVM体系
  • automative
  • 阿里云游戏服务器多少钱一个月?
  • Netty的常用组件及线程模型设计(一)
  • Redis(02)——事务管理
  • 摘录笔记——2024年2月5日
  • 【RPA】浅谈RPA技术及其应用
  • 设计模式2-对象池模式
  • 机器人学、机器视觉与控制 上机笔记(第一版译文版 2.1章节)
  • epoll 系列系统调用(I/O复用函数)
  • 【开源】基于JAVA+Vue+SpringBoot的停车场收费系统
  • 深入探索:缓冲区溢出漏洞及其防范策略
  • 【Cocos入门】场景切换(loadScene、preloadScene)
  • Django模板(三)
  • 寒假作业7
  • Day 41 | 动态规划 343. 整数拆分 、 96.不同的二叉搜索树
  • JavaScript基础(28)_获取元素的其他样式
  • 提速MySQL:数据库性能加速策略全解析
  • 前后端分离项目:前端的文件夹应该叫什么名字,后端呢