設計模式 單例模式

2021-09-24 04:01:44 字數 2256 閱讀 6242

書上對單例模式的定義:

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

通常我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件,乙個最好的辦法就是,讓類自身負責儲存它的唯一例項,這個類可以保證沒有其他例項可以被建立,並且它可以提供乙個訪問該例項的方法。

這裡我想跟大家說下我在書上看到一句話,當我們在構建軟體的世界中遇到問題時,我們從現實生活中尋找答案,以及現實生活中很多的可行解,都能從軟體的世界中得到啟發。大家共勉。

首先防止new 把類的構造方法宣告為private, 這樣外部就不能通過new來構建新的例項了。其次提供乙個全域性訪問點,即宣告乙個用static修飾獲取的方法來訪問。

第一種單例,這種方法又叫做懶漢式,執行緒不安全的。

public class singleton1 

public static singleton1 getinstance()

return instance;

}}

測試

public static void main(string args) 

結果:true

第二種,對第一種方法進行改進,使讓其執行緒安全於是進行加鎖,這樣就防止多個執行緒越過if==null的情況,再多次建立執行緒。

public class singleton2 

public static singleton2 getinstance()

}return instance;

}}

測試:

public class main extends thread

public static void main(string args)

}}結果:

2124340618

2124340618

2124340618

2124340618

2124340618

2124340618 //代表執行緒安全,實現了單例

上面這種效能降低了。為了增加點效能,於是將鎖的粒度精細,但是,要預防死鎖。

第三種: 採用網上的雙重檢測判空但是這個不一定保證對,因為不是原子操作。所以多個執行緒操作第一判斷非null時可能會直接返回乙個還未分配完記憶體的位址。解決辦法是給變數加上volatile.

public class singleton3 

public static singleton3 getinstance()}}

return instance;

}}

測試:測試**和上面一樣

1372676747

1372676747

1372676747

1372676747

1372676747

1372676747

第四種,推薦網上的靜態內部類的方法

public class singleton4 

private static class singletoninner

public static final singleton4 getinstance()

}

測試**不附上了。

同時為什麼這個模式能保證延遲初始化,又能保證單例,保證執行緒安全,根據虛擬機器規範來保證。請參考:

還有一種方法,即通過類的初始化來保證單例

public class singleton5 

static

public static singleton5 getinstance()

}

最後一種就是列舉來實現

列舉實現,每個例項預設都是static final的.

public

class

single

private single getinstance()

}public

static single getinstance()

public

static

void

main

(string[

] args)

結果:a==btrue

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...