26种设计模式之单例模式

目录

什么是单例模式

单例模式的优点

创建单例模式的三大要点

单例模式的实例方式

饿汉模式

懒汉模式

使用场景


什么是单例模式

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

什么是只有一个实例?

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

单例模式的优点

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

创建单例模式的三大要点

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

单例模式的实例方式

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

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

优缺点比较:

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

饿汉模式

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

懒汉模式

java 复制代码
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. 懒加载
    如果对象创建本身就⽐较消耗资源,⽽且可能在整个程序中都不⼀定会使⽤,可以使⽤单例模式实现懒加载。
相关推荐
不停喝水3 分钟前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
y1su8 分钟前
Leetcode 二分模板
java·数据结构·算法·leetcode·排序算法
霸道流氓气质28 分钟前
多Agent通信机制与协议设计完全指南:从FIPA-ACL到A2A/MCP的Java生产级实战
java·开发语言
007张三丰34 分钟前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·c语言·c++·内存管理
骇客野人1 小时前
Java BIO / NIO / AIO 完整详解 + 编程技巧
java·开发语言·nio
霸道流氓气质1 小时前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
m0_587383001 小时前
24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·spring·系统架构·需求分析
栖凤1 小时前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
小师兄吃牛肉1 小时前
Java 同步系列之 ZooKeeper 分布式锁
java·分布式·java-zookeeper