Singleton(单件)模式

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 模式理解的不是很深刻, 也可以说只是一个表皮。反正以后会回头来看的。现在先理解到这里吧。还请高手多多指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值