大家好我是苏麟 , 今天聊聊单例设计模式 .
此系列全是帮忙宣传 , 原创放在下面了 .
单例模式是?种创建型设计模式, 它的核?思想是保证?个类只有?个实例,并提供?个全局访问点来访问这个实例。
单例模式的优点
单例设计模式的基本要求
单例模式的实现?式有多种,包括懒汉式、饿汉式等等。
饿汉式指的是在类加载时就已经完成了实例的创建,不管后?创建的实例有没有使?,先创建再说,所以叫做 “饿汉”。
懒汉式指的是只有在请求实例时才会创建,如果在?次请求时还没有创建,就创建?个新的实例,如果已经创 建,就返回已有的实例,意思就是需要使?了再创建,所以称为“懒汉”。
基础版
/**
* @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)
这期就到这里 , 下期见!