C 設計模式 單例模式(簡單的說)

2022-02-05 15:12:55 字數 3756 閱讀 3636

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

概念拆解:

(1)確保乙個類只有乙個例項

(2)提供乙個訪問它的全域性訪問點

個人理解:

乙個類不被new,在類裡的方法不被重複的new,在多執行緒呼叫例項時,確保只有乙個例項在執行。

生活中的例子:

乙個國家只有乙個**。

簡單的單例模式**:

///

///單例模式的實現

///public

class

singleton

//////

定義公有方法提供乙個全域性訪問點,同時你也可以定義公有屬性來提供全域性訪問點

//////

public

static

singleton getinstance()

return

uniqueinstance;

}}

》在多執行緒中,需要確保乙個例項。(我們可以使用執行緒鎖lock來控制 )

///

///單例模式的實現

/// public

class

singleton

//////

定義公有方法提供乙個全域性訪問點,同時你也可以定義公有屬性來提供全域性訪問點

/// ///

public

static

singleton getinstance()

}return

uniqueinstance;

}}

》多執行緒的「雙重鎖定」(目的:為了減少不必要的開銷)

///

///單例模式的實現

/// public

class

singleton

//////

定義公有方法提供乙個全域性訪問點,同時你也可以定義公有屬性來提供全域性訪問點

/// ///

public

static

singleton getinstance()}}

return

uniqueinstance;

}}

簡單模擬**計數功能

public

class

singleton

}public

static singleton getinstance()//

方法,方法中去例項化類.}}

return

instance;

}}

在某個時候我只需要乙個執行緒去處理事務,不想有多個例項時。例如我們建立乙個資料庫訪問的管理類。類中有許多的方法。

public

class

dbmanager

//////

全域性訪問點

/// ///

public

static

dbmanager getinstance()}}

return

uniqueinstance;

}#endregion

#region 檔案列表操作

//////插入路徑

/// ///

路徑 ///

public

bool insertfilepath(string

path)

else

}//////

插入路徑

/// ///

遊服id

///路徑 ///

public

bool insertfilepath(int serverid,string

path)

else

}//////

刪除

/// ///

路徑 ///

public

bool deletefilepath(string

path)

else

}//////

更新最後的備份時間

/// ///

路徑 ///

public

bool updatetime(string

path)

else

}//////

獲取檔案列表

/// ///

public listgetfilelist()

if (!convert.isdbnull(reader["

filepath

"]))

if (!convert.isdbnull(reader["

status

"]))

if (!convert.isdbnull(reader["

lastbackuptime

"]))

filelist.add(data);

}return

filelist;

}//////

更新serverid

/// ///

///public

bool updateserverid(string path,string

serverid)

else

}#endregion

}

說了單例模式的一些概念和**,重要的是我們要怎麼應用在實際的開發中?以下是我在找到的關於單例的運用場景。

1. windows的task manager(任務管理器)就是很典型的單例模式(這個很熟悉吧),想想看,是不是呢,你能開啟兩個windows task manager嗎? 不信你自己試試看哦~ 

2. windows的recycle bin(**站)也是典型的單例應用。在整個系統執行過程中,**站一直維護著僅有的乙個例項。

3.**的計數器,一般也是採用單例模式實現,否則難以同步。

4.應用程式的日誌應用,一般都何用單例模式實現,這一般是由於共享的日誌檔案一直處於開啟狀態,因為只能有乙個例項去操作,否則內容不好追加。

5.web應用的配置物件的讀取,一般也應用單例模式,這個是由於配置檔案是共享的資源。

6.資料庫連線池的設計一般也是採用單例模式,因為資料庫連線是一種資料庫資源。資料庫軟體系統中使用資料庫連線池,主要是節省開啟或者關閉資料庫連線所引起的效率損耗,這種效率上的損耗還是非常昂貴的,因為何用單例模式來維護,就可以大大降低這種損耗。

7.多執行緒的執行緒池的設計一般也是採用單例模式,這是由於執行緒池要方便對池中的執行緒進行控制。

8.作業系統的檔案系統,也是大的單例模式實現的具體例子,乙個作業系統只能有乙個檔案系統。

總結以上,不難看出:

單例模式應用的場景一般發現在以下條件下:

(1)資源共享的情況下,避免由於資源操作時導致的效能或損耗等。如上述中的日誌檔案,應用配置。

(2)控制資源的情況下,方便資源之間的互相通訊。如執行緒池等。

我說設計模式 單例模式(Singleton)

單例模式 singleton 單例模式按照實現方式可以有三個類別 懶漢模式,餓漢模式和註冊模式。單例通常用於對唯一資源的管理,規定對特定資源只有乙個訪問例項介面。例如一夫一妻,一人一身份證等等。單例由於其唯一性必須具備以下特點 1 單例類只能有乙個例項。2 單例類必須自己建立自己的唯一例項。3 單例...

設計模式 C 設計模式 單例模式

設計模式 物件導向設計七大原則 設計模式 設計模式概念和分類 設計模式 c 設計模式 單例模式 設計模式 c 設計模式 工廠方法模式 設計模式 c 設計模式 抽象工廠模式 設計模式 c 設計模式 建造者模式 設計模式 c 設計模式 原型模式 作者自用的泛型單例模組 單例模式 singleton pa...

C 設計模式 (單例模式)

單例模式 顧名思義,只有乙個物件例項,即保證乙個類只有乙個物件可以使用。作用類似於乙個全域性變數,可以任意呼叫,但是比全域性變數更容易管理,使用。單例模式也有很多種實現方式 第一種實現方法 h檔案 class csock test public casyncsocket cpp檔案 csock te...