單例模式屬於對象創建型模式,其意圖是保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。對一些類來說,只有一個實例是很重要的,雖然系統中可以有許多打印機,但卻只應該有一個打印機假脫機,只應該有一個文件系統和一個窗口管理器,一個數字濾波器只能有一個A/D轉換器,一個會計系統只能專用於一個公司。怎樣才能保證一個類只有一個實例並且這個實例易於被訪問,一個全局變量使得一個對象可以被訪問,但它不能防止你實例化多個對象,一個更好的方法是讓類自身負責保存他的唯一實例。這個類可以保證沒有其他實例可以被創建,並且它可以提供一個訪問該實例的方法,這就是Singleton模式。
實用性:在下面的情況下可以使用Singleton模式。
l當類只能有一個實例而且客戶可以從一個衆所周知的訪問點訪問它時。
l當這個唯一實例應該是通過子類化可擴展的,並且客戶應該無需更改代碼就能使用一個擴展的實例時。
例如:一個產生隨機數的例子,整個應用程序中只需要一個類的實例來產生隨機數,客戶端程序從類中獲取這個實例,調用這個實例的方法nextInt(),公用的方法訪問需要進行同步,這是單例模式需要解決的同步問題。
參與者:Singleton:定義一個Instance操作,允許客戶訪問它的唯一實例,Instance是一個類操作。可能負責創建自己的唯一實例。
協作關係:客戶只能通過Singleton的Instance操作訪問一個Singleton的實例。
使用Singleton模式有許多優點:
1.對唯一實例的受控訪問,
2.縮小命名空間,
3.允許對操作和表示的精化,
4.允許可變數目的實例。
5.比類操作更靈活。
代碼:
單例模式中需要解決的重要問題是方法的同步問題,同步的粒度有多大等。在本例子中同在獲得類的實例的時候使用了同步,代碼如下:
public class Singleton{
private Singleton(){
generator=new Random();
}
public void setSeed(intseed){
generator.setSeed(seed);
}
public int nextInt(){
return generator.nextInt();
}
public static synchronized Singleton getInstance(){
if(instance==null) {
instance=new Singleton();
}
return instance;
}
private Randomgenerator;
private static Singleton instance;
}
客戶端調用的代碼:
package singleton;
public class Client{
public static void main(String[] args){
Singleton s1 = Singleton.getInstance();
System.out.println(s1.toString());
for(int i=0;i<10;i++){
Singleton s2 = Singleton.getInstance();
System.out.println("The randomed numberis "+s2.toString());
}
}
}
總結:單例模式使得應用程序在運行時保持只能有一個實例,在一些大的應用程序中,主程序只需要有一個,因此需要使用單例模式
本文出自“凌輝” 博客,請務必保留此出處http://tianli.blog.51cto.com/190322/43743