設計模式 單例模式

2021-08-21 01:48:35 字數 2737 閱讀 7127

設計模式——單例模式

作為開發者的我們,想必設計模式對大家來說並不陌生,設計模式共有23種,分別是:工廠方法(factorymethod)、抽象工廠(abstractfactory) 、建造者模式(builder)、單態模式(singleton)、 原型模式(prototype)、 介面卡模式(adapter)、橋接模式(bridge) 、組合模式(composite) 、裝飾模式(decorator)、外觀模式(facade)、 享元模式(flyweight)、**模式(proxy)、責任鏈模式(chain of responsibility)、 命令模式(command)、 直譯器模式(interpreter) 、迭代器模式(iterator)、中介者模式(mediator)、備忘錄模式(memento)、觀察者模式(observer)、狀態模式(state)、策略模式(strategy) 、模板方法(templatemethod)、訪問者模式(visitor)。這23種設計模式又分為三類,分別是:建立型模式、結構型模式和行為型模式。建立型模式分別包含的是工廠方法(factorymethod)、抽象工廠(abstractfactory) 、建造者模式(builder)、單態模式(singleton)、 原型模式(prototype)。結構型模式分別包含的是: 介面卡模式(adapter)、橋接模式(bridge) 、組合模式(composite) 、裝飾模式(decorator)、外觀模式(facade)、 享元模式(flyweight)、**模式(proxy)。行為型模式分別包含的是:責任鏈模式(chain of responsibility)、 命令模式(command)、 直譯器模式(interpreter) 、迭代器模式(iterator)、中介者模式(mediator)、備忘錄模式(memento)、觀察者模式(observer)、狀態模式(state)、策略模式(strategy) 、模板方法(templatemethod)、訪問者模式(visitor)。

了解了以上還遠遠不夠,下面我們就來了解一下23種設計模式之一的單例模式。單例模式對我們開發者來說是再熟悉不過了。單例模式又分為餓漢式(執行緒安全,呼叫效率高。但是不能延時載入)、懶漢式(執行緒安全,呼叫效率低。可以延時載入)、雙重檢測鎖(由於此模式偶爾會出現問題,不建議使用)、靜態內部類式(執行緒安全,呼叫效率高。可以延時載入)、列舉單例(執行緒安全,呼叫效率高。不能延時載入)。單例模式的優點是:減少系統開銷。我們經常使用的是餓漢式和懶漢式這兩種。我們先來說一下餓漢式,餓這個字我想大家都知道啥意思,舉個例子:當你很餓的時候你會去挑選你喜歡的食物嗎?當然不會。當你很餓的時候,恰好發現有一些食物,此時的你不管是否是自己喜歡的食物,只要能充飢你都會去吃的。餓漢式模式也是一樣,不論是否使用,先建立乙個例項再說。缺點就是如果只載入本類,而不去呼叫getsingleton()這個方法的話,將會造成資源的浪費。因為一開始上來不論分說的先建立例項,這樣很容易造成資源浪費。

public

class singleton

public

static singleton getsingleton()

}

懶漢式則就不同了,懶漢式就好比你不是很餓,此時的你很睏正在床上休息,不論旁邊的人如何喊你吃東西,只要不是自己特別喜歡吃的,你都懶得起來去吃,當聽到有你喜歡吃的東西的時候此時的你可能會去品嚐一下。懶漢式就是這樣,不呼叫就不例項化。雖然解決了資源的浪費,但是由於每次呼叫getsingleton() 時都要同步,造成併發效率特別低。也許有人會說我不會不加synchronized 這個關鍵字進行同步限制嗎?但是這樣做是不行的,如果併發量有點高的情況下容易造成多次例項化,比如說執行緒1和執行緒2呼叫了getsingleton()這個方法,當剛呼叫還沒有來得及判斷singleton是否為空是,此時執行緒1掛起了,然後當執行緒2執行到singleton = new singleton2()時,執行緒2掛起,此時執行緒1又從剛剛掛起的地方執行,這樣就導致被例項化了兩次。如果加了synchronized 以後,即使執行緒1掛起,執行緒2也不會去執行,直到執行緒1執行完,執行緒2才會去執行。

public

class singleton2

public

static synchronized singleton2 getsingleton()

return singleton;

}}

雙重檢測鎖,顧名思義就是多次檢測,這個模式將同步內容放到if裡面,這樣做提高了執行效率,沒有必要每次獲取物件時都要進行同步,只有第一次才會同步,以後每次都不需要。由於編譯器優化問題此模式不建議使用。

public

class

singleton3

public

static singleton3 getsingleton()

}singleton = st;}}

}return singleton;

}}

靜態內部類模式,裡面會用到final 這個關鍵字,static final 的作用就是防止被改變。這樣獲取到的空間位址永遠是不會改變的,這樣就會保證只有乙個例項存在,而且是執行緒安全的。具備有高併發和延時載入的優勢。

public

class singleton4

public

singleton4()

public

static singleton4 getsingleton()

}

列舉單例,列舉本身就是單例,缺點就是沒有延時載入。

public

enum singleton5

設計模式——單例模式

設計模式 單例模式

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