單例模式 Singleton

2021-08-26 19:24:41 字數 2086 閱讀 3541

0.前言

在一年多前就開始學習設計模式了,主要看的是gof的那本書《設計模式-可復用物件導向軟體的基礎》,很好的一本書。當時沒打算開部落格,所以把所有筆記都寫到了onenote上,現在想好好整理下,盡量都寫到部落格裡面來,一方面希望對他人有幫助,一方面也是自己知識的乙個積累和鞏固的過程。

1.正文

在23個設計模式中,最簡單應該就是單例(singleton)模式了,個人感覺學習設計模式才能更好地理解各種原始碼的設計,提高**的復用性以及提高自己的程式設計能力。

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

對一些類來說,只有乙個例項是很重要的。比如說執行緒池、快取、對話方塊、日誌物件等。乙個全域性變數使得乙個物件可以被訪問到,但它不能防止你例項化多個物件。 那我們怎樣才能保證只有乙個例項呢 ?乙個好的方法就是讓類自身負責儲存它的唯一例項。這個類可以保證沒有其它例項可以被建立,並且它提供乙個訪問該例項的方法。這就是單例模式(singleton)。

結構圖

示例**

package com.rdc.dp;

public class singleton

protected singleton() {}

public static singleton getintance()

return instance;

}}

定義乙個私有的靜態例項變數instance,建立這個例項的操作隱藏在本類中的乙個類方法getinstance,而這個類方法保證了只有乙個例項被建立。這個getinstance方法可以訪問唯一的例項變數,並且可以保證這個變數在返回值之前用這個唯一例項初始化。這裡還有乙個無參的構造方法,其實你可以根據需要進行初始化操作。需要注意的是,這裡的構造方法的型別是protected,意味著在同一包中的所有類和不同包的子類中都可以訪問,這時可以改為private,這樣就只有本類可以訪問。

測試方法

package com.rdc;

import com.rdc.dp.singleton;

public class main

}}

測試得到的結果是:objects are the same instance!!

成功了,我們做到了乙個類只例項化乙個。很簡單是吧,確實,正常情況下這個類只能例項化乙個,但如果是多執行緒情況下會怎麼樣呢?

試想一下,假如我們有兩個執行緒,當執行緒1執行到 if(instance == null),賦值語句instance = new singleton() 還沒發生之前,這時的instance是為null的,然後恰巧這時轉到執行緒2去執行了,它剛好執行到if判斷。在這種情況下就會有兩個不同的例項被建立了。那該怎麼解決呢?

解決辦法

一是可以給方法加鎖,即當執行到這個方法時,不管哪乙個執行緒,每次執行到這個方法時,都要檢查有沒有其它正在用這個方法的執行緒,有的話要等這個方法執行完後再執行該執行緒,沒有的話直接執行。注意:給方法同步的開銷是比較大的,慎用。

修改上面的getinstance方法

//讓方法同步

public synchronized static singleton getintance()

return instance;

}

二是定義例項變數時就new出來,然後getintance方法不要延遲載入。

package com.rdc.dp;

public class singleton

public static singleton getintance()

}

三是使用double-checked locking,volatile是在jdk 1.5之後才有的,具體實現如下:

public class singleton 

public static singleton getinstance() }}

return instance;}}

這樣,單例模式的簡單例子就差不多了。

Singleton 單例 模式

singleton 模式的宗旨在於確保某個類只有乙個例項,別且為之提供乙個全域性訪問點。為了防止其他工作人員例項化我們的類,可以為該類建立唯一乙個構造器,並將構造器的可見 設定為私有。值得注意的是,如果我們建立了其他的非私有的構造器,或者根本沒有為該類提 供構造器,那麼其他人員還是能例項化我們的類。...

Singleton 單例 模式

今天看了,單例模式。感覺他的本質就是,控制類例項的個數。特例就是,控制static變數的唯一性,保證各個程式共享著同一例項。乙個例子 package singleton description 這是乙個單例模式的使用demo author kyle goal 實現乙個類僅有乙個例項 singleto...

單例(Singleton)模式

單例模式的特點 singleton模式包含的角色只有乙個,那就是singleton。singleton擁有乙個私有建構函式,確保使用者無法通過new取得singleton的例項。除此之外,該模式中包含乙個靜態私有成員變數instance與靜態公有方法instance。instance方法負責檢驗並例...