单例模式是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,因为这种模式提供了一种创建对象的最佳方式。
Java 单例类
这个模式涉及到一个负责创建对象的单个类,同时确保只有一个对象被创建。此类提供了访问其唯一对象的方式,可以直接访问而无需实例化该类的对象。
由于只有一个单例实例,因此单例的所有实例字段每类只会出现一次,就像静态字段一样。单例经常控制对资源的访问,例如数据库连接或套接字。
例如,如果您只有一个数据库连接的许可证或许您的 JDBC 驱动程序在多线程环境中存在问题,单例模式可以确保只建立一个连接或者每次只有一个线程能够访问该连接。
单例设计模式的优势
单例设计模式节省内存,因为它只创建一个对象实例,并且它还提供了对其实例的全局访问。
单例设计模式的应用场景
当您希望创建这样一个类时会使用单例设计模式,这类只有一个实例。主要在多线程环境中用于创建多线程和与数据库相关的应用程序。
一些使用单例设计模式的设计包括:
Java 单例类/设计模式:示例
示例 1
最简单的实现包括一个私有构造函数和一个用来保存结果的字段,以及一个名为 getInstance()
的静态访问器方法。
私有字段可以在静态初始化块内部分配,或者更简单地使用初始化器。getInstance()
方法(必须为公共)然后简单地返回这个实例:
package com.tutorialspoint;
class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() { }
public static Singleton getInstance() {
return singleton;
}
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() {
}
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() {
}
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