首页 > 其他分享 >单例模式

单例模式

时间:2023-12-27 22:32:31浏览次数:29  
标签:对象 模式 静态 实例 static 单例 public

5 单例模式

  • 单例模式是保证实例唯一性的重要手段。
  • 单例模式首先通过将类的实例化方法私有化来防止程序通过其他方式创建该类的实例,然后通过提供一个全局唯一获取该类实例的方法帮助用户获取类的实例,用户只需也只能通过调用该方法获取类的实例。
  • 单例模式的常见写法有懒汉模式(线程安全)、饿汉模式、静态内部类、双重校验锁,如下。

5.1 懒汉模式(线程安全)

  • 定义一个私有的静态对象 instance,之所以定义instance为静态,是因为静态属性或方法是属于类的,能够很好地保障单例对象的唯一性;

  • 然后定义一个加锁的静态方法获取该对象,如果该对象为null,则定义一个对象实例并将其赋值给instance,这样下次再获取该对象时便能够直接获取了。

    • 懒汉模式在获取对象实例时做了加锁操作,因此是线程安全的。
 public class LazySingleton {
     // 定义一个私有的静态对象
     private static LazySingleton instance;
 ​
     public LazySingleton() {
     }
 ​
     // 懒汉模式在获取对象实例时做了加锁操作,因此是线程安全的
     public static synchronized LazySingleton getInstance() {
         if (instance == null) {
             instance = new LazySingleton();
         }
         return instance;
     }
 }

5.2 饿汉模式

  • 在类中直接定义全局的静态对象的实例并初始化,然后提供一个方法获取该实例对象。
  • 在饿汉模式下,在 Class Loader 完成后该类的实例便已经存在于 JVM 中了。
 public class HungrySingleton {
     
     // 饿汉模式是在定义单例对象的同时将其实例化的,直接使用便可。
     // 也就是说,在饿汉模式下,在Class Loader完成后该类的实例便已经存在于JVM中了
     private static HungrySingleton instance = new HungrySingleton();
     public HungrySingleton() {
     }
     public static HungrySingleton getInstance() {
         return instance;
     }
 }

5.3 静态内部类

  • 在类中定义一个静态内部类,将对象实例的定义和初始化放在内部类中完成, 我们在获取对象时要通过静态内部类调用其单例对象。
  • 之所以这样设计,是因为类的静态内部类在 JVM 中是唯一的,这很好地保障了单例对象的唯一性。
 // 之所以这样设计,是因为类的静态内部类在JVM中是唯一的,这很好地保障了单例对象的唯一性
 public class Singleton {
     // 在类中定义一个静态内部类,将对象实例的定义和初始化放在内部类中完成
     private static class SingletonHolder {
         private static final Singleton INSTANCE = new Singleton();
     }
     public Singleton() {
     }
 ​
     public static final Singleton getInstance() {
         return SingletonHolder.INSTANCE;
     }
 }

5.4 双重校验锁

  • 在懒汉模式的基础上做进一步优化,给静态对象的定义加上 volatile 锁来保障初始化时对象的唯一性,在获取对象时通过 synchronized (Singleton.class) 给单例类加锁来保障操作的唯一性。
 public class Lock2Singleton {
     private volatile static Lock2Singleton singleton;//对象锁
     public Lock2Singleton() {
     }
     public static Lock2Singleton getInstance() {
         if (singleton == null) {
             synchronized (Lock2Singleton.class){//方法锁
                 if (singleton == null){
                     singleton = new Lock2Singleton();
                 }
             }
         }
         return singleton;
     }
 }

标签:对象,模式,静态,实例,static,单例,public
From: https://blog.51cto.com/u_15473389/9004886

相关文章

  • 代理模式
    6代理模式⭐️介绍在代理模式下有两种角色,一种是被代理者,一种是代理(Proxy)。被代理者需要做一项工作时,不用自己做,而是交给代理做。使用代理对象来代替对真实对象(realobject)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。代理模式的主要作用是......
  • Composite 组合模式简介与 C# 示例【结构型3】【设计模式来了_8】
    Composite组合模式简介与C#示例【结构型3】【设计模式来了_8】 阅读目录〇、简介1、什么是组合设计模式?2、优缺点和适用场景一、简单的代码示例二、根据示例代码看结构三、相关模式回到顶部〇、简介1、什么是组合设计模式?一句话解释:  针对树形结构......
  • Facade 外观模式简介与 C# 示例【结构型5】【设计模式来了_10】
    Facade外观模式简介与C#示例【结构型5】【设计模式来了_10】 阅读目录〇、简介1、什么是外观模式?2、外观模式的优缺点和适用场景一、外观模式的代码实现二、结构三、相关模式回到顶部〇、简介1、什么是外观模式?一句话解释:  将一系列需要一起进行的......
  • Builder 生成器模式简介与 C# 示例【创建型2】【设计模式来了_2】
    Builder生成器模式简介与C#示例【创建型2】【设计模式来了_2】 阅读目录〇、简介1、什么是生成器模式?2、优缺点和使用场景一、简单的示例代码二、生成器模式结构三、在.Net框架中的实际应用四、相关模式回到顶部〇、简介1、什么是生成器模式?一句话......
  • Decorator 装饰者模式简介与 C# 示例【结构型4】【设计模式来了_9】
    Decorator装饰者模式简介与C#示例【结构型4】【设计模式来了_9】 阅读目录〇、简介1、什么是装饰者模式2、优缺点和适用场景一、通过示例代码简单实现二、装饰者模式的结构三、相关模式回到顶部〇、简介1、什么是装饰者模式一句话解释:  通过继承统......
  • 80386保护模式笔记
    目录保护模式简述分段管理机制控制寄存器与系统地址寄存器任务状态段和控制门控制转移任务内无特权级变换的转移,段间转移:任务内不同特权级的变换转移任务切换386中断和异常中断异常中断门或陷阱门的转移转移总结任务切换途径任务内特权集变换途径任务内相同特权级转移的途径操作系......
  • 不会使用 EF Core 的 Code First 模式?来看看这篇文章,手把手地教你
    EFCoreCodeFirst是什么CodeFirst是EntityFrameworkCore(简称EFCore)的一种开发模式,它允许开发人员使用纯粹的代码来定义数据模型,通过它,可以极大地提高开发效率:使用CodeFirst开发模式,你可以专注于定义领域模型和业务逻辑,而无需关注数据库的细节,能够更快地构建应......
  • Java 工厂方法设计模式
    需求:Pizza有以下几个方法prepare()准备食材bake()烘焙cut()切割box()装盒现在有2种披萨且和2地区有关,成都地区第一种是CDApplePizza,第二种是CDCheesePizza。北京地区的BJApplePizza和BJApplePizza。PizzaStore有点单系统Order(city,pizzaType)根据pizzatype去制作对......
  • Java 简单工厂模式
    需求:Pizza有以下几个方法prepare()准备食材bake()烘焙cut()切割box()装盒现在有两种披萨,第一种是ApplePizza,第二种是CheesePizza。PizzaStore有点单系统Order(pizzaType)根据pizzatype去制作对应的Pizza。Pizza的抽象类publicabstractclassPizza{Strin......
  • Java实现单例模式
    饿汉式静态常量饿汉式的优点是:在类装载的时候就完成实例化,没有达到LazyLoading的效果,并且避免了线程同步问题。它的缺点是:如果从始至终从未使用过这个实例,则会造成内存的浪费。publicclassadaDemo3{publicstaticvoidmain(String[]args){Singletonins......