1. 程式人生 > >程式設計題: 寫一個Singleton

程式設計題: 寫一個Singleton

。在 web 程式中我們會用一個核心的分配功能的Servlet程式,在這裡我們就可以運用這種設計模式了。
一般Singleton模式通常有幾種種形式:
第一種形式:
定義一個類,它的建構函式為private的,它有一個static的private的該類變數,在類初始化時例項話,通過一個public的getInstance方法獲取對它的引用,繼而呼叫其中的方法。
public class Singleton {
private Singleton(){}

//在自己內部定義自己一個例項,是不是很奇怪?
//注意這是private 只供內部呼叫
private static Singleton instance = new Singleton();

//這裡提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance() {
       return instance;
   }
}
第二種形式:

public class Singleton {
private static Singleton instance=null;
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
在要應用時,直接在類中寫入Singleton s=Singleton.getInstance()即可(?)
1.instance 是私有的,開始時賦值為 null,外部只有通過 getInstance 方法才能獲得他。
2.構造方法是私有的,這點很重要,保證只有這個類自己才能夠呼叫,其他的類無法呼叫此建構函式。
3.getInstance 方法中:
   if 語句,保證只有一個 instance 存在;唯一的一個Singleton在第一次呼叫的時候被建立。

另外,在還查到有這種方式,是一個執行緒的安全應用,多執行緒即禁用clone()方法,產生一個CloneNotSupportedException例外。
public class Singleton
{

   // Private constructor suppresses generation

   //  of a (public) default constructor

   private Singleton() {}

   private static class SingletonHolder

   {

     private final static Singleton INSTANCE = new Singleton();

   }

   public static Singleton getInstance()

   {

     return SingletonHolder.INSTANCE;

   }

}
與第三種方式有些相似,即方式三是將getInstance()方法設為static synchronized。
提示:
Java語言在設計的時候就使用了很多設計模式的思想,像 Collection 中的 Iterator 模式,Event 中的 Observer 模式,Applet 中的 Templete 模式,物件建立時的 Factory 模式,這些模式大多可以從 Java 的類的命名中體現出來。現在所看的 Thinking in JAVA 中的前幾章就提到了工廠模式,現在不是很清楚。