設計模式 單例模式

2021-08-17 03:02:44 字數 1293 閱讀 3987

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項,並提供乙個全域性訪問點。

使用單例模式的目的在於盡可能節約記憶體空間,減少gc的消耗。

乙個類能否成為單例,主要就是說這些類在應用中如果有兩個以上例項會引起一定錯誤。

首先看下乙個最原始的單例模式

public classsingleton 

//給出乙個公共的靜態方法返回乙個單一例項

public staticsingleton getinstance() returnsingleton; } }

上面最原始的**主要通過靜態例項+私有化構造方法來建立的。但是如果考慮到多執行緒的話,上面的**就不行了,那麼有人想到用synchronize,

public classsingleton

public synchronized staticsingleton getinstance() returnsingleton; } }

做法是很簡單,但是會造成很多無謂的等待,是非常不好的設計。其實,將上面的更改下就會好多了,如下:

public classsingleton

public staticsingleton getinstance() } } returnsingleton; } }

在只有例項為null的情況下才會去建立同步,大大減少了同步時間,而在同步內的if判斷是因為,如果執行緒a和執行緒b都在synchronized外判斷了singleton為null,然後a獲取了執行緒鎖然後將singleton例項化了,最後釋放鎖,這時,b拿到了鎖,而如果沒有在此判斷singleton是否為nul的話,b就會在建立乙個例項了。

雖然上面的已經基本解決了在多執行緒下的單例模式,但考慮其他方面,上述方式也存在一定侷限。下面介紹最終兩種方式:餓漢模式和懶漢模式

餓漢模式:系統中物件只有有乙個唯一的例項,將物件的建立交給成員變數,空間換時間,一開始就建立例項。但容易造成資源的浪費,不過也沒什麼影響。

public classmyservlet 

public staticmyservlet getinstance()

}

懶漢模式(推薦):用到例項時候再初始化物件,使用靜態內部類實現可以避免多執行緒下的安全問題。

public classlazysingleton 

privatelazysingleton(){}

public staticlazysingleton getinstance() }

下一節:命令模式

設計模式 單例模式

單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...