設計模式之九 單例模式
大家好,幾天沒寫設計模式的博文了。如今讓我扯扯單例模式。
什麼是單例模式呢?顧名思義,就是一個例項。
那麼我們為什麼須要一個例項呢?或者說什麼情況下須要一個例項呢?
比方說:當我們對系統的註冊表進行管理的時候。我們就希望僅僅有一個註冊表物件。這時候就是用單例模式來做
先來看看定義:
單例模式:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點
那麼。how?
我們知道,建立一個類一定要有建構函式,那麼怎麼確保別人不會呼叫我的建構函式呢?僅僅要做成私有的就能夠。
這樣就僅僅能在我這個類中呼叫我的私有的建構函式
那麼。怎麼訪問呢?我們能夠提供一個靜態方法來獲得這個單例。
JAVA能夠有3中方式實現單例模式
法一.
package edu.fjnu.cs.hwb.singleton;
//空間換時間。一開始就例項化了。也叫做餓汗式載入
public class Singleton
{
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance()
{
return singleton;
}
}
法二.
package edu.fjnu.cs.hwb.singleton; //懶漢式載入。當須要的時候在產生物件。
時間換空間。可是每次獲得例項都要進行同步(僅僅有當第一次建立這個物件的時候才須要同步)效率低. public class Singleton { private static Singleton singleton = null; private Singleton(){} public synchronized static Singleton getInstance() { if( singleton == null) singleton = new Singleton(); return singleton; } }
法三.
package edu.fjnu.cs.hwb.singleton; //雙重檢查加鎖 public class Singleton { //volatile修飾的變數。全部對該變數的讀寫都是直接操作共享記憶體,從而確保多個執行緒能正確的處理該變數。
private volatile static Singleton singleton = null; private Singleton(){} public static Singleton getInstance() { if( singleton == null) synchronized (Singleton.class) { if( singleton == null) singleton = new Singleton(); } return singleton; } }
基本上就是這樣了.