Sington單例模式 建立型模式

2022-01-15 00:37:58 字數 3030 閱讀 3506

一、使用sington單例模式的動機(motivation)

在軟體系統中,經常有一些特殊的類,必須保證它們只有乙個例項,才能保證它的邏輯正確性、以及良好的效率。

大多數類用的是常規的構造器,所以往往能建立很多例項,那麼如何繞過常規的構造器,並且提供一種機制(設計模式)來保證乙個類只有乙個例項。

二、使用singtong(單例設計模式)的意圖

保證乙個類只有乙個例項,並且提供乙個該例項的全域性訪問點

三、結構

四、使用singleton(單例設計模式)需要注意的幾個點

1、singleton模式中的例項構造器可以設定成protected,方便子類繼承

2、singleton模式一般不要支援icloneable介面,因為這可能會建立出多個例項,這與singleton模式的初中所違背

3、singleton模式也不要支援序列化,這也可能建立出多個物件例項

4、singleton只考慮了物件建立的管理,並沒有考慮物件銷毀的管理,就支援垃圾**的平台和物件來講,這麼點開銷,一般沒有必要對其進行特殊的管理,除非這個類超級大(但是如果這個類如果很大的話,那這個類需要重構).

5、不能應對多執行緒的情況,如果在多執行緒環境下,下面的緊接著的例項**可能會建立出多個例項。

五、**演示

1、單執行緒singleton(單例模式)實現         (最基本的一種)

using

system;

namespace

singleton

同乙個例項

", (object.referenceequals(s1, s2) == true) == true ? "

是" : "

不是");//

輸出:s1和s2是同乙個例項

} }

/** (單執行緒)單例模式的第一種實現方式(最基本的實現方法)

* 目地:實現用單例模式實現的類只有乙個例項,而且全域性共享這個例項

*/class

singleton1

//這裡使用私有建構函式的原因是:因為如果我們不給類定義建構函式,那麼c#編譯器會給當前類加乙個預設的共有的構造器函式,但是如果我們在類中定義了建構函式那麼c#編譯器

//將不會在該類中新增預設的共有構造器函式,所以我們在這裡定義乙個私有構造器,那麼c#編譯器將不會給類新增共有的構造器,而且這個構造器將不會被外界呼叫

//所以該類無法被例項化,也就是new出來

private

singleton1()

//1、既然singleton1類無法在外部被例項化,那麼我們就必須在內部singleton1例項化,然後提供乙個公有的方法將該例項返回

public

static

singleton1 getinstance()

return

instance;}}

}

分析:根據控制台的輸出可以肯定的是,singleton1.getinstance()建立出來的例項都是同乙個例項,但是這裡存在乙個問題,這只是在單執行緒的情況下是這樣的,如果在多執行緒的情況下,假設兩個執行緒同時判斷if(instance==null),那麼接下來會new出兩個不同的例項。所以上面的**僅適用於單執行緒的情況!

2、多執行緒單例模式

管理volicate關鍵字請參考基元執行緒同步構造之使用者模式-易變構造volatile

using

system;

namespace

singleton

}class

singleton

//給lock語句提供的object物件,不能是值或者string型別,具體原因參考多執行緒lock語句的規範

private

static object lockhelper = new

object

();

//1、將構造器函式設定私有的原因是:外部物件呼叫本類時,無法通過new的方式,只能通過本類內部提供的方法來獲取本類的例項

//2、這裡注意:如果不給類定義構造器函式,那麼c#編譯器會給類新增乙個預設的公有構造器函式,如果我們自己定義了,那麼c#編譯器就不會自己定義了

private

singleton()

//將本類的例項通過本類公開的屬性給外部類(物件)訪問

public

static

singleton instance}}

return

instance;}}

}}

3、既能解決多執行緒環境,也能實現singleton模式的實現方法(單執行緒和多執行緒下都能實現singleton模式(單例模式))的實現方法

using

system;

namespace

singletons

}class

singletonbest

}//上面的內聯初始化的方式等同於下面的建立方式

class

singlebest1

private

singlebest1() }}

4、解決"內聯初試化"實現單例模式靜態建構函式無法引數化的問題

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

singleton

//通過公開乙個oninit()來實現當前類的引數化

public

void

oninit()

//通過公開屬性的方式給當前例項傳參

private

int_x;

private

int_y;

public

intx

set

}public

inty

set }}

}

建立型模式 單例

單例模式 public class singleinstance 非執行緒安全的獲取例項方法 public static singleinstance getnonthreadsafeinstance return si 執行緒安全的獲取例項方法 簡單進行加鎖對效率會有一定影響 public sta...

建立型模式 單例模式

餓漢式 package com.hfview.designmode.signle 1.餓漢式 就是在初始化成員變數的時候就獲取例項物件 2.public class signlemode private signlemode 懶漢式 package com.hfview.designmode.sig...

建立型模式 單例模式

概述 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。適用性 當類只能有乙個事例而且客戶可以從乙個眾所周知的訪問點訪問它時。當這個唯一事例應該是通過子類化可擴充套件的,並且客戶應該無需更改 就能使用乙個擴充套件的例項時。參與者 singleton 定義乙個instance操作,允許客戶訪問它...