MENU

Java-33 static关键字的应用:单例Singleton设计模式

October 6, 2023 • Read: 68 • Java阅读设置

面向对象编程

单例Singleton设计模式

1 What is Singleton

简单地说,单例是指类的实例化对象有且只有一个。

因此,设计单例是指设计只存在一个实例化对象的类。

单例设计模式是指设计只存在一个实例化对象的类的方式或者说方法或者说“套路”。

2 Singleton design pattern

单例设计模式的内容:
1)私有化构造器。这样能够使得外部无法实例化对象。
2)在类的内部实例化一个对象,将该对象作为该类的一个私有、静态的属性的值。

  • 私有。为了使得外部无法访问该属性,从而使得该属性的值无法被外部直接修改。
    如果外部能够访问该属性(当该属性为静态时),那么外部就能够通过访问该属性来修改该属性的值,会导致内部实例化的对象丢失,因为该属性的设置就是为了存放内部实例化对象的。
    这也解释了为什么不直接通过静态属性使外部获取该唯一的实例化对象,因为访问属性就能修改属性,但访问方法,只能调用方法,无法重新修改方法内容。
  • 静态。为了使得外部能够获取内部实例化的唯一的对象,创建静态方法使外部通过调用静态方法来获取实例化对象。由于静态方法只能使用静态属性,因此属性设置为静态。
    为什么一定要设置静态方法?:静态方法使得该方法的加载不依赖于任何对象的构造。换句话说,如果不静态该方法,需要先有对象,只能通过对象访问该方法。

3)创建静态方法返回上面的私有、静态属性,使得外部能够获取唯一的实例化对象。

3 Eager Singleton饿汉式单例类 & Lazy Singleton懒汉式单例类

  • 饿汉式单例类:类中先实例化好对象,通过方法来获取该对象。

    • 优点:是线程安全的。
    • 缺点:对象的加载时间过长。因为即使不使用该对象,该对象也一直存在着。
      2023-10-06T13:51:31.png
  • 懒汉式单例类:类中没有先实例化好对象,而是在外部需要使用该对象时,在调用方法时同时完成实例化对象(如果是首次使用该对象)和对象的获取。

    • 优点:延迟对象创建。
    • 缺点:目前的写法是线程不安全的,具体改写等到后续学习完线程后实现。
      2023-10-06T13:51:48.png

4 单例模式的优点和应用场景

优点:
2023-10-06T13:53:10.png

应用场景:
2023-10-06T13:53:56.png

5 补充:解决线程安全的懒汉式单例类

2023-11-03T03:56:02.png

Last Modified: November 3, 2023