Singleton模式:
又称单态模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点(getInstance())。
在很多操作中,比如建立目录,数据库连接,访问计数器等都需要这样的单线程操作。
方法一:
定义一个类,它的构造函数为private的,所有方法为static的,因此无法得到该类的实例,只能通过访问静态成员的方式来使用
public class Singleton {
private Singleton(){} //将构造函数声明为私有,阻止一切试图将该类实例化的行为
private static int a,b; //私有全局变量,只供内部调用
public static int Compute() //静态方法,供外部访问
{
return (a+b);
}
}
外部调用Singleton.getInstance(),得到一个Singleton实例,且只能得到这个实例,以后再次调用Singleton.getInstance()仍得到的是这个实例。
方法二:
定义一个类,它的构造函数为private的,它有一个static的private的该类的实例变量,在类初始化时实例化,通过一个public的getInstance方法获取对它的引用,继而让外部调用该方法:
public class Singleton {
private Singleton(){}//将构造函数声明为私有,阻止一切试图将该类实例化的行为,只允许通过类调用(类静态方法调用)来得到实例
private static Singleton instance = null;
public static synchronized Singleton getInstance() //使用同步修饰方法,每时刻只能有一个线程使用该方法。
{
if (instance==null)
instance=new Singleton();
return instance; }
}
该定义方法在类装载时就生成一个该类的实例,且日后无论何时调用该类中的getInstance(),得到的仍是那个静态的instance,从而保证该类只有这么一个实例(即返回的static instance)
方法三:
用全局(静态)标志位来保证只有一个实例被生成。
public class Singleton {
static boolean instance_flag = false; //定义全局标志位,用于检测是否有实例生成,为true则有,为flase则无
public singleton() throws SingletonException //构造函数
{ if(instance_flag)
throw SingletonException("only one instance is allowed!"); //如果有实例,则抛出异常
else
instance_flag = true;
System.out.println("instance created!");
}
public void finalize()
{
instance_flag = false; //实例被GC清除时将标志位复位。
}
}
前两种方法都不通过构造函数生成实例
第一种方法不能产生类的实例,只能通过静态访问来使用该类。
第二种方法通过调用一个静态的getInstance()方法来得到类的实例,该实例在类被装载时就已静态生成。
第三种方法通过设置一个全局标志来控制实例的生成次数,在调用构造函数时就判断是否已有实例存在,如有则抛出异常。