《设计模式精解》学习笔记(十二)------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模式理解的不是很深刻,也可以说只是一个表皮。反正以后会回头来看的。现在先理解到这里吧。还请高手多多指点。
Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=611868