Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误与异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级Java

Java 杂项

Java APIs与框架

Java 类引用

Java 有用资源

Java - 单例类



Java单例设计模式

单例模式是Java中最简单的设计模式之一。这种设计模式属于创建模式,因为它提供了一种创建对象的最佳方法。

Java单例类

这种模式涉及一个单一的类,它负责创建对象,同时确保只创建单个对象。这个类提供了一种访问其唯一对象的方法,可以直接访问而无需实例化类的对象。

由于只有一个单例实例,单例的任何实例字段都只会在每个类中出现一次,就像静态字段一样。单例通常控制对资源的访问,例如数据库连接或套接字。

例如,如果您只有一个数据库连接许可证,或者您的JDBC驱动程序在多线程方面存在问题,则单例确保只建立一个连接,或者只有一个线程可以同时访问连接。

单例设计模式的优点

单例设计模式节省内存,因为它只创建了一个对象实例,并且它还提供对其实例的全局访问。

单例设计模式的用途

当您想要创建一个只有一个实例的类时,使用单例设计模式。它主要用于多线程中,以创建多线程和数据库相关的应用程序。

一些使用单例设计模式的设计

  • 创建日志记录类
  • 创建与配置管理相关的类
  • 创建与数据库连接池相关的类
  • 为缓存机制创建一个类

Java单例类/设计模式:示例

示例1

最简单的实现包括一个私有构造函数和一个用于保存其结果的字段,以及一个具有诸如getInstance()之类的名称的静态访问器方法。

私有字段可以在静态初始化块中赋值,或者更简单地使用初始化器赋值。getInstance()方法(必须是公共的)然后简单地返回此实例 -

package com.tutorialspoint;

class Singleton {

   private static Singleton singleton = new Singleton( );

   /* A private Constructor prevents any other
    * class from instantiating.
    */
   private Singleton() { }

   /* Static 'instance' method */
   public static Singleton getInstance( ) {
      return singleton;
   }

   /* Other methods protected by singleton-ness */
   protected void demoMethod( ) {
      System.out.println("demoMethod for singleton");
   }
}
public class Tester {

   public static void main(String[] args) {
      Singleton tmp = Singleton.getInstance( );
      tmp.demoMethod( );
   }
}

如果您编译并执行上述程序,您将得到以下结果 -

输出

demoMethod for singleton

示例2

下面的实现显示了一个经典的单例设计模式。在这个例子中,ClassicSingleton类维护对唯一单例实例的静态引用,并从静态getInstance()方法返回该引用。

在这里,ClassicSingleton类采用了一种称为延迟实例化的技术来创建单例;因此,只有在第一次调用getInstance()方法时才会创建单例实例。这种技术确保仅在需要时才创建单例实例。

package com.tutorialspoint;

class ClassicSingleton {

   private static ClassicSingleton instance = null;
   private ClassicSingleton() {
      // Exists only to defeat instantiation.
   }

   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
   
   protected void demoMethod( ) {
      System.out.println("demoMethod for singleton");
   }
}
public class Tester {

   public static void main(String[] args) {
      ClassicSingleton tmp = ClassicSingleton.getInstance( );
      tmp.demoMethod( );
   }
}

如果您编译并执行上述程序,您将得到以下结果 -

输出

demoMethod for singleton

示例3

下面的实现显示了一个线程安全的单例对象创建。在这个例子中,ClassicSingleton类维护对唯一单例实例的静态引用,并从静态getInstance()方法返回该引用,我们使用synchronized关键字使其成为线程安全的。

class ClassicSingleton {

   private static ClassicSingleton instance = null;
   private ClassicSingleton() {
      // Exists only to defeat instantiation.
   }

   public static synchronized ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
   
   protected void demoMethod( ) {
      System.out.println("demoMethod for singleton");
   }
}
public class Tester {

   public static void main(String[] args) {
      ClassicSingleton tmp = ClassicSingleton.getInstance( );
      tmp.demoMethod( );
   }
}

如果您编译并执行上述程序,您将得到以下结果 -

输出

demoMethod for singleton
广告