1. 只允许一个实例在存在:类构造函数为私有, 防止其它对象实例化该对象。
2.全局访问该对象 :提供一个公有方法, 以创建或是获取对象,因为其它对象无法新实例化该对象,将公有方法设为静态,以便全局调用。
3.自行创建该类的实例.:提供一个私有类对象, 该对象只被创建一次。
①。常用方式
public class Singleton
{
//私有对象
private static Singleton instance = null;
//私有构造函数
private Singleton()
{
}
//公有方法获取对象
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class)
{
instance = new Singleton();
}
}
return instance;
}
}
②。内部生成
public class Singleton
{
//私有对象
private static Singleton instance = new Singleton();
//私有构造函数
private Singleton()
{
}
//公有方法获取对象
public static Singleton getInstance()
{
return instance;
}
}
③。 双检查
public class SingletonDoubleCheck
{
private static SingletonDoubleCheck instance = null;
private SingletonDoubleCheck()
{
}
private static SingletonDoubleCheck getInstance()
{
if (instance == null)
{
synchronized (SingletonDoubleCheck.class)
{
if (instance == null)
{
instance = new SingletonDoubleCheck();
}
}
}
return instance;
}
}
此种方法是避免多线程中可能发生同时创建了多个实例的风险。
④。枚举式
public enum EnumSingleton
{
INSTANCE("instance.name.test");
private String key;
private EnumSingleton(String key)
{
this.key = key;
System.out.println("instance.....");
}
public String getKey()
{
return key;
}
public static void main(String[] args)
{
System.out.println(EnumSingleton.INSTANCE.getKey());
System.out.println(EnumSingleton.INSTANCE.getKey());
System.out.println(EnumSingleton.INSTANCE.getKey());
}
}
jdk 1.5以后支持的一种方法, 此方法是线程安全的。