单例的目的是控制对象的创建,将对象的数量限制为只有一个。由于只有一个单例实例,单例的实例字段将只会在每个类中出现一次,就像静态字段一样。单例通常控制对资源的访问,比如数据库连接或套接字。
例如,如果您只有一个数据库连接许可证或者您的JDBC驱动程序在多线程上有问题,单例可以确保只有一个连接被建立,或者只有一个线程可以同时访问连接。
最简单的实现方式包括一个私有构造函数和一个用于保存结果的字段,以及一个名为getInstance()的静态访问器方法。
私有字段可以在静态初始化块中赋值,或者更简单地使用一个初始化器。getInstance()方法(必须是公共的)只需返回此实例即可-
// File Name: Singleton.java
public 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 static void demoMethod( ) {
System.out.println("demoMethod for singleton");
}
}
这是我们将创建单例对象的主程序文件 –
// File Name: SingletonDemo.java
public class SingletonDemo {
public static void main(String[] args) {
Singleton tmp = Singleton.getInstance( );
tmp.demoMethod( );
}
}
这将产生以下结果:
demoMethod for singleton
以下实现展示了一个经典的单例设计模式?
public 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;
}
}
ClassicSingleton类维护了一个对独立单例实例的静态引用,并从静态的getInstance()方法返回该引用。
这里,ClassicSingleton类使用了一种称为延迟实例化的技术来创建单例;结果是,直到第一次调用getInstance()方法时,单例实例才会被创建。这种技术确保只有在需要时才创建单例实例。