Java 简明教程
Java - Singleton Class
Java Singleton Design Pattern
单例模式是 Java 中最简单的设计模式之一。此类设计模式属于创建模式,因为此模式提供了创建 object 的最佳方法之一。
Java Singleton Class
此模式包含一个单一类,该类负责创建对象,同时确保只创建一个对象。该类提供了一种访问其唯一对象的方法,可以直接访问该对象,而不必实例化该类的对象。
由于只有一个 Singleton 实例,Singleton 的任何实例字段都仅在每个类中出现一次,就像静态字段一样。Singleton 通常控制对资源的访问,例如数据库连接或套接字。
例如,如果只有数据库的一个连接许可证,或者 JDBC 驱动程序在多线程中遇到问题,Singleton 确保只进行一个连接,或一次只有一个线程可以访问该连接。
Use of Singleton Design Pattern
当您想创建一个只有一个实例的类时,可以使用 singleton 设计模式。它主要用于多线程,以创建多线程和数据库相关的应用程序。
使用 singleton 设计模式的一些设计:
-
To create logger classes
-
用于创建与配置管理相关的类
-
用于创建与数据库连接池相关的类
-
用于创建用于缓存机制的类
Java Singleton Class/Design Pattern: Examples
Example 1
最简单的实现包含一个私有构造函数和一个用于保存其结果的字段,以及一个名为 getInstance() 的静态访问器方法。
可以在静态 initializer block 中分配私有字段,或者更简单地使用初始化器分配。然后 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
Example 2
以下实现展示了一个典型的 Singleton 设计模式。在此示例中,ClassicSingleton 类维护对唯一 singleton 实例的静态引用,并从静态 getInstance() 方法返回该引用。
在此,ClassicSingleton 类采用称为延迟实例化的技术来创建 singleton;因此,singleton 实例只在首次调用 getInstance() 方法时创建。此技术可确保只在需要时创建 singleton 实例。
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
Example 3
以下实现演示了线程安全 Singleton 对象创建。在此示例中,ClassicSingleton 类维护对唯一 singleton 实例的静态引用,并从使用 synchronized 关键字使其成为线程安全的静态 getInstance() 方法中返回该引用。
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