設計模式 單例模式

2021-09-29 03:48:06 字數 2213 閱讀 6163

學習了單例模式,自己記一下筆記,本文從乙個單例模式開始進行一步一步的演進,使用c#語言,在實現上會結合c#的特性。演進過程為

單執行緒無引數單例模式->多執行緒無引數單例模式->.net特性多執行緒無引數單例模式->單執行緒有引數單例模式->多執行緒有引數單例模式->.net特性多執行緒有引數單例模式

public

class

singleton

public

static

singleton instance

return instance;}}

}

我們以乙個最簡單的單例模式起手,單例模式顧名思義就是要讓該類只有乙個初始化的物件,首先我們需要做的是將物件的構造方法進行私有化,這樣改物件就不能在外部進行例項化new,從下圖可以看到當我們進行private私有化之後,在外部已經不能訪問了。

下面我們在該函式內部進行例項化,進行判空如果物件沒有被例項化就進行示例化,該單例模式只試用與單執行緒使用。為什麼只能在單執行緒中使用?我們可以看到在每次呼叫instance的時候都會進行執行if (instance == null)進行判空,但是當在多執行緒的時候,有可能兩個執行緒同時滿足該條件,例如:在第乙個執行緒判斷為空後,還沒有進行例項化,這時候第二個執行緒進行了判空,將進入該語句,這樣的情況就會進行兩次例項化。下面我們修改這個方法讓多執行緒可以安全使用

public

class

singleton

public

static

singleton instance

}}return instance;}}

}

這是乙個可以多執行緒使用的單例模式,進行了加鎖,並進行了兩次判斷。private static object lockhelper = new object(); 這裡可以任意寫乙個物件,只是用於加鎖使用。

class

singleton

}

這段**可以說是非常精簡,可以擴充套件下看著更清晰

class

singleton

private

singleton()

}

在第一種方式中我們使用了內聯初始化,在.net中會將初始化內容放入構造器中初始化,因為是靜態變數所以為靜態初始化器所以如下面的**。

靜態初始化器執行時期:在靜態字段初始化之前進行初始化,如singleton類就是當呼叫instance時會進行初始化

我們用下面的**測試一下執行時機:

static

void

main

(string

args)

class

singleton

private

singleton()

}

執行結果:

我們可以看到在第一次呼叫instance時才會發生初始化,這樣就是乙個基於.net特性的單例模式。

//單執行緒

public

class

singleton

public

static

singleton

getinstance

(int x,

int y)

else

return instance;

}}

多執行緒:

//多執行緒

public

class

singleton

public

static

singleton

getinstance

(int x,

int y)

else}}

return instance;

}}

.ne特性的**,大家直接宣告字段然後賦值就可以了,這裡就不示範了。

設計模式 單例模式

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