Singleton (单件)模式
GoF : 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Singleton 模式是比较简单的。
由于性能的原因,我可能不希望反复地实例化这些对象,然后又将它们销 毁。而且,尽管我可以再开始时实例化所有可能的策略对象,但如果策略的数量变得越来越大,这种方法也就越来越低。相反,最好的方法是在需要时进行实例化, 但只进行一次实例化。
Singleton 模式的工作方式是:拥有一个特定的方法,这个方法被用于实例化需要的对象。
l 当这个方法被调用时,它检查这个对象是否已经被实例化。如果对象已经被实例化,这个方法仅仅返回这个对象的一个 引用。如果对象尚未实例化,这个方法将对象实例化并返回这个新的实例的引用。
l 为了确保这是创建这个类型的对象的惟一途径,我在这个类中将构造函数定义为 protected 或 private 。
Singleton 模式的最大用途就是:它让我们可以仅仅对对象进行一次实例化,而不要求客户对象关心这个对象是否存 在。
下面是 Singleton 模式的 UML 图:
下面给出一个简单的例子:
package Singleton;
public class Singleton
{
private int sing = 0;
private Singleton()// 提供一个私有构造函数防止继 承
{
//do something...
}//end Singleton()
private static Singleton instance = new Singleton();
public void printMessage()
{
System.out.println("Singleton Pattern ! ");
sing++;
System.out.println("sing = " + sing);
}//end printMessage()
public static Singleton getInstance()
{
return instance;
}//end getInstance()
}//end class Singleton
package Singleton;
public class SingletonPattern
{
private Singleton sl;
private Singleton sl2;
private Singleton sl3;
private Singleton sl4;
public void SingletonTest()
{
sl = Singleton.getInstance();
sl2 = Singleton.getInstance();
sl3 = Singleton.getInstance();
sl4 = Singleton.getInstance();
sl.printMessage();// 实现同步互斥
sl2.printMessage();
sl3.printMessage();
sl4.printMessage();
}//end SingletonTest()
public static void main(String[] args)
{
System.out.println("The Singleton Pattern!");
SingletonPattern sp = new SingletonPattern();
sp.SingletonTest();
}//end main(...)
}//end class SingletonPattern
下面是运行结果:
The Singleton Pattern!
Singleton Pattern !
sing = 1
Singleton Pattern !
sing = 2
Singleton Pattern !
sing = 3
Singleton Pattern !
sing = 4
Singleton 模式有好几种形式:上面的 Singleton 类是一种。下面在给出一种:
public class Singleton
{
private static Singleton instance = null;
public static synchronized Singleton getInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}//end getInstance()
}//end class Singleton
在网上查了好多资料,据大牛们说第一种方法在 Java 中 比较安全。我细想了一番但是没有完全理解。在这里就不乱发表意见了。
Singleton 模式还有一种变体:叫 double-checked locking (DCL) 是用于多线程的。对于这个变体,网上也颇多争议,在这里我也不发表意见。可能是认识不够,也很可能是 水平太有限,我想不到我以前做过的程序里哪里能用上 Singleton 模式。所以关于 Singleton 模式理解的不是很深刻, 也可以说只是一个表皮。反正以后会回头来看的。现在先理解到这里吧。还请高手多多指点。