Java中的单例设计模式

2025年8月18日 | 阅读 5 分钟

单例模式表示只需"定义一个只有一个实例的类,并提供一个全局访问点"。

换句话说,一个类必须确保只创建一个实例,并且所有其他类都可以使用单个对象。

单例设计模式有两种形式

  • 早期实例化: 在加载时创建实例。
  • 延迟实例化: 在需要时创建实例。

单例设计模式的优点

  • 节省内存,因为不会在每个请求时都创建对象。只重复使用单个实例。

单例设计模式的用途

  • 单例模式主要用于多线程和数据库应用程序。 它用于日志记录、缓存、线程池、配置设置等。

单例设计模式的UML图

Singleton Design Pattern

如何创建单例设计模式?

要创建单例类,我们需要具有类的静态成员、私有构造函数和静态工厂方法。

  • 静态成员: 由于是静态的,它只获取一次内存,它包含单例类的实例。
  • 私有构造函数: 它将阻止从类外部实例化单例类。
  • 静态工厂方法: 这为单例对象提供全局访问点,并将实例返回给调用者。

了解单例模式的早期实例化

在这种情况下,我们在声明静态数据成员时创建类的实例,因此类的实例在类加载时创建。

让我们看看使用早期实例化的单例设计模式的示例。

文件:A.java

了解单例模式的延迟实例化

在这种情况下,我们在同步方法或同步块中创建类的实例,因此类的实例在需要时创建。

让我们看看使用延迟实例化的单例设计模式的简单示例。

文件:A.java

类加载器在单例模式中的意义

如果单例类由两个类加载器加载,则将创建单例类的两个实例,每个类加载器一个。


序列化在单例模式中的意义

如果单例类是可序列化的,则可以序列化单例实例。 一旦序列化,您可以反序列化它,但它不会返回单例对象。

要解决此问题,您需要覆盖readResolve() 方法,该方法强制执行单例。 它在对象反序列化后立即调用。 它返回单例对象。


了解单例模式的真实示例

  • 我们将创建一个JDBCSingleton类。 此JDBCSingleton类将其构造函数包含为私有,并且包含其自身的私有静态实例jdbc。
  • JDBCSingleton类提供了一个静态方法来将其静态实例提供给外部世界。 现在,JDBCSingletonDemo类将使用JDBCSingleton类来获取JDBCSingleton对象。
example of Singleton Design Pattern

假设: 您已在mysql数据库中创建了一个包含三个字段 uid、uname 和 upassword 的表userdata。 数据库名称为ashwinirajput,用户名是root,密码是ashwini。

文件:JDBCSingleton.java
文件:JDBCSingletonDemo.java

输出

Singleton Design Pattern output 1 Singleton Design Pattern output 2 Singleton Design Pattern output 3
下一个主题原型设计模式