设计模式-单例模式

大家好我是苏麟 , 今天聊聊单例设计模式 .

此系列全是帮忙宣传 , 原创放在下面了 .

单例模式

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

  • 只有⼀个实例的意思是,在整个应⽤程序中,只存在该类的⼀个实例对象,⽽不是创建多个相同类型的对象。
  • 全局访问点的意思是,为了让其他类能够获取到这个唯⼀实例,该类提供了⼀个全局访问点(通常是⼀个静态 ⽅法),通过这个⽅法就能获得实例。

单例模式的优点

  • 全局控制:保证只有⼀个实例,这样就可以严格的控制客户怎样访问它以及何时访问它,简单的说就是对唯⼀ 实例的受控访问
  • 节省资源:也正是因为只有⼀个实例存在,就避免多次创建了相同的对象,从⽽节省了系统资源,⽽且多个模 块还可以通过单例实例共享数据
  • 懒加载:单例模式可以实现懒加载,只有在需要时才进⾏实例化,这⽆疑会提⾼程序的性能

单例设计模式的基本要求

  • 私有的构造函数:防⽌外部代码直接创建类的实例
  • 私有的静态实例变量:保存该类的唯⼀实例
  • 公有的静态⽅法:通过公有的静态⽅法来获取类的实例

单例设计模式的实现

单例模式的实现⽅式有多种,包括懒汉式、饿汉式等等。

饿汉式指的是在类加载时就已经完成了实例的创建,不管后⾯创建的实例有没有使⽤,先创建再说,所以叫做 “饿汉”。

懒汉式指的是只有在请求实例时才会创建,如果在⾸次请求时还没有创建,就创建⼀个新的实例,如果已经创 建,就返回已有的实例,意思就是需要使⽤了再创建,所以称为“懒汉”。

饿汉式

基础版

/**
 * @className: Singletion
 * @author: SL 苏麟
 **/
public class Singleton {
    private static final Singleton singleton = new Singleton();
    
    private Singleton(){
        // 私有构造⽅法,防⽌外部实例化
    }
    
    public static Singleton getSingleton(){
        return singleton;
    }
}

内部类实现版 


/**
 * @className: Singletion
 * @author: SL 苏麟
 **/
public class Singleton {
    
    //静态内部类实现
    private static class SingletonClass{
        private static final Singleton singleton = new Singleton();
    }

    private Singleton(){

    }

    public static Singleton getSingleton(){
        return SingletonClass.singleton;
    }
}

内部类版

/**
 * @className: Singletion
 * @author: SL 苏麟
 **/
public enum Singleton {
    //private static final Singleton singleton = new Singleton();
    SINGLETON
}

懒汉式

基础版


/**
 * @className: Singletion
 * @author: SL 苏麟
 **/
public class Singleton {
    private static  Singleton instance;

    private Singleton() {
        // 私有构造⽅法,防⽌外部实例化
    }

    // 使⽤了同步关键字来确保线程安全, 可能会影响性能
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

 线程安全版

/**
 * @className: Singletion
 * @author: SL 苏麟
 **/
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造⽅法,防⽌外部实例化
    }

    // 使⽤了同步关键字来确保线程安全, 可能会影响性能
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

双检锁版



/**
 * @className: Singletion
 * @author: SL 苏麟
 **/

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
        // 私有构造⽅法,防⽌外部实例化
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

什么时候使⽤单例设计模式

在什么场景下应该考虑使⽤单例设计模式呢?可以结合单例设计模式的优点来看。

1. 资源共享

多个模块共享某个资源的时候,可以使⽤单例模式,⽐如说应⽤程序需要⼀个全局的配置管理器来存储和管理配置 信息、亦或是使⽤单例模式管理数据库连接池。

2. 只有⼀个实例

当系统中某个类只需要⼀个实例来协调⾏为的时候,可以考虑使⽤单例模式, ⽐如说管理应⽤程序中的缓存,确保 只有⼀个缓存实例,避免重复的缓存创建和管理,或者使⽤单例模式来创建和管理线程池。

3. 懒加载

如果对象创建本身就⽐较消耗资源,⽽且可能在整个程序中都不⼀定会使⽤,可以使⽤单例模式实现懒加载。 在许多流⾏的⼯具和库中,也都使⽤到了单例设计模式,⽐如Java中的 Runtime 类就是⼀个经典的单例,表示程序 的运⾏时环境。此外 Spring 框架中的应⽤上下⽂ ( ApplicationContext ) 也被设计为单例,以提供对应⽤程序中 所有 bean 的集中式访问点。

原创地址GitHub - youngyangyang04/kama-DesignPattern: 卡码网-23种设计模式精讲,每种设计模式都配套代码练习题,支持 Java,CPP,Python,Go

想要了解更多 : 单例模式 | 菜鸟教程 (runoob.com)


这期就到这里 , 下期见!

相关推荐

  1. 设计模式

    2024-01-20 07:26:04       37 阅读
  2. 设计模式

    2024-01-20 07:26:04       18 阅读
  3. 设计模式

    2024-01-20 07:26:04       16 阅读
  4. 设计模式

    2024-01-20 07:26:04       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-20 07:26:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-20 07:26:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-20 07:26:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-20 07:26:04       20 阅读

热门阅读

  1. 从C到C++:向面向对象过渡的技巧与诀窍

    2024-01-20 07:26:04       24 阅读
  2. 【话题】自然语言处理的发展

    2024-01-20 07:26:04       31 阅读
  3. 【数据库原理】(33)数据库实施阶段

    2024-01-20 07:26:04       31 阅读
  4. Android 13.0 Recent列表不显示某个app

    2024-01-20 07:26:04       27 阅读
  5. Wargames与bash知识21

    2024-01-20 07:26:04       27 阅读
  6. Godot FileDialog无法访问其它盘符的文件

    2024-01-20 07:26:04       36 阅读
  7. Unity文字游戏开发日志(2)——存档与读档

    2024-01-20 07:26:04       33 阅读