小話設計模式(一)單例模式

2021-07-22 21:49:39 字數 1373 閱讀 3519

那麼具體要求是什麼樣的呢?簡而言之,在程式執行期間,單例類的例項只能有乙個(或沒有)。恩?說好的是類似於全域性變數的東西呢?當然為了能在程式任何地方呼叫它,需要為它實現乙個靜態方法(例如getinstance),通過這個方法可以獲得單例類的唯一例項。

廢話不多說直接上c#**:

public class singleton

public static singleton getinstance()

}} return instance;

} public static void purgeinstance()

}

這就是廣為流傳的執行緒安全的懶漢型單例。

靜態singleton型別的instance變數便是singleton的例項,因為是static的變數,所以可以保證例項只會有乙個。

為了保證例項唯一,還要把建構函式的訪問修飾符設定為protected,這樣外部就無法呼叫new singleton()來建立例項了。

為了保證執行緒安全,我們新建了乙個唯讀的object作為鎖,並在上下分別加了instance == null的判斷。第乙個判斷是為了防止執行緒每一次都要加鎖,第二個判斷是為了讓等待中的執行緒進入**片之後不會再重新建立單例。

有時候我們可能需要重建單例,那麼purgeinstance方法就為這項操作提供了前提。

或許有人就會發現乙個問題,每次新增乙個單例類的時候,都需要把上面的那些**重新寫一遍,雖然複製、貼上、查詢、替換這些操作也不算太複雜。但是重複的勞動總歸不美不科學。這位朋友,你幸運了,正巧c#有一種叫做泛型的東西。我們來看看怎麼實現:

public class tsingletonwhere t : class, new() 

}} return instance;

} public static void purgeinstance()

}

用法:

public class mysingleton: tsingleton

最大的缺陷在於建構函式必須是public,這樣便無法保證單例的唯一性,只是保證了全域性訪問。

寫在後面:

單例模式是乙個非常好用的模式,一般會用在管理類或者程式裡只有唯一例項的類。例如乙個公司的ceo,就可視作單例(雖然對底層碼農來講可能並不是全域性訪問)。再比如,乙個遊戲裡的資源管理類,我可能需要隨時訪問它,並且不希望每次載入的時候都要新建乙個資源管理類的例項,那麼單例就是你的可選項之一(或者靜態類,各有千秋)。

但是單例多了,可能並不是乙個好事,一方面,**可讀性會變差,另一方面,如果乙個單例類裡的資料對外是可以被修改的,那麼它就會具有跟全域性變數一樣的危害(全域性可寫會導致不可預知的錯誤,並且除錯起來會非常困難)。

小話設計模式二 單例模式

單例模式定義 只有乙個例項,單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。單例模式特點 1 這個類只能有乙個例項 2 這個類必須自行建立這個例項 3 這個類必須自行向整個系統提供這個例項 單例模式解析 下面是單例模式的uml圖 下面是簡單 實現 單例模式...

設計模式 一 單例模式

思路 1 如果其他程式能夠隨意用new建立該類物件,那麼就無法控制個數。因此,不讓其他程式用new建立該類的物件。2 既然不讓其他程式new該類物件,那麼該類在自己內部就要建立乙個物件,否則該類就永遠無法建立物件了。3 該類將建立的物件對外 整個系統 提供,讓其他程式獲取並使用。步驟 1 將該類中的...

設計模式(一) 單例模式

這種模式只涉及到乙個單一的類,該類負責建立自己的物件,並確保只建立乙個物件。單例只有乙個例項 單例類必須建立自己唯一的例項 單例類必須給其他物件提供這唯一的例項 由於當今的程式設計模型都是基於多執行緒方式,因此此處只介紹執行緒安全的幾種實現。第一次被呼叫時才建立物件,屬於懶載入 lazy init ...