Java单例的目的是控制对象的创建,数量限制,但允许灵活性,以创造更多的对象,如果情况的变化.
由于只有一个Singleton实例,任何一个Singleton实例字段将发生每班只有一次,就像静态字段。单身往往控制访问资源,如数据库连接或套接字.
例如,如果你有许可证,只有一个数据库连接或你的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 - by www.gitbook.net public class SingletonDemo { public static void main(String[] args) { Singleton tmp = Singleton.getInstance( ); tmp.demoMethod( ); } }
这将产生以下结果:
demoMethod for singleton
实施以下显示了一个典型的单例(Singleton)设计模式:
public class ClassicSingleton { private static ClassicSingleton instance = null; protected ClassicSingleton() { // Exists only to defeat instantiation. by www.gitbook.net } public static ClassicSingleton getInstance() { if(instance == null) { instance = new ClassicSingleton(); } return instance; } }
ClassicSingleton类维护一个孤独的单例实例的静态引用,并返回从静态getInstance()方法参考.
这里ClassicSingleton类采用的技术被称为惰性的实例创建的单例;作为一个结果,直到第一次调用getInstance()方法不创建Singleton实例。此方法可确保只在需要时创建单例实例.