設計模式 單例模式

2021-09-24 05:51:41 字數 2316 閱讀 6210

相關問題

設計模式是一套反覆使用、多數人知曉的、經過分類編目的、**設計經驗的總結。

目的:使用設計模式是為了可重用**、讓**更容易被他人理解、保證**可靠性。

單例模式的定義:單例模式確保乙個類只有乙個例項,並供乙個全域性訪問點。

單例模式的作用在於保證整個程式在一次執行的過程中,被單例模式宣告的類的物件要有且只有乙個。針對不同的應用場景,單例模式的實現要求也不同。

單例模式特點:

1、單例類只能有乙個例項。

2、單例類必須自己建立自己的唯一例項。

3、單例類必須給所有其他物件提供這一例項。

public

class

singleton

//用getinstance()方法例項化物件,並返回這個例項

public

static singleton getinstence()

return uniqueinstance;

}//這裡是其他的有用的方法。(singleton是乙個正常的類,具有一些其他用途的例項變數和方法)

}

uniqueinstance是乙個靜態變數。請注意這裡如果我們不需要這個例項,它就永遠不會產生。這就是延遲例項化。如果uniqueinstance不是null就表示之前已經建立過物件,我們就直接跳到return語句。

只要把getinstence()變成同步(synchronized)方法,多執行緒災難幾乎就可以輕易的解決

public

class

singleton

;//通過增加synchronized關鍵字到getinstance()方法中,我們迫使每個執行緒在進入這個方法之前,要先等候別的執行緒離開該方法。也就是說不會有兩個執行緒可以同時進入這個方法

public

static synchronized singleton getinstance()

return uniqueinstance;

}}

這樣可以解決問題。但是同步會降低效能,這又是另乙個問題。更嚴重的是:只有第一次執行此方法時,才真正需要同步。換句話說,一旦設定好uniqueinstance變數,就不再需要同步這個方法了。之後每次-呼叫這個方法,同步都是一種累贅。

似乎同步getinstance()的做法將拖垮效能,該怎麼辦呢?

可以有以下選擇:

如果你的應用程式可以接受getinstance()造成的額外負擔,就忘了這件事吧。同步getinstance()的方法既簡單又有效。但你必須知道,同步乙個方法可能造成程式執行的效率下降100倍。

如果應用程式總是建立並使用單例例項,或者在建立和執行時方面的負擔不太繁重,你可能想要急切建立此單例:

public

class

singleton

public

static

getinstance()

}

利用這個做法,我們依賴jvm在載入這個類時馬上建立此唯一的單例例項。jvm保證在任何執行緒訪問uniqueinstance靜態變數之前,一定先建立此例項。

利用雙重檢查加鎖,首先檢查是否例項已經建立了,如果尚未建立,「才」進行同步。這樣一來,只有第一次會同步,這正是我們想要的。

public

class

singleton

public

static singleton getinstance()

}}return uniqueinstance;

}}

如果效能是你關心的重點,那麼整個做法可以幫你大大地減少getinstance()的時間耗費。

不,一點兒也不浪費。如果有乙個登錄檔設定的物件,你不希望這樣的物件有多個拷貝吧?那會把設定搞得一團亂。利用單例物件,可以確保程式中使用的全域性資源只有乙份單例經常來管理共享的資源,例如資料庫連線、執行緒池、配置檔案、工具類、快取、日誌物件等。

沒有公開的構造器。構造器設定為私有的,外人為了取得我的例項,他們必須「請求」得到乙個例項,而不是自行例項化得到乙個例項。我的類有乙個靜態方法,叫做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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...