單例模式:確保乙個類只有乙個例項,並提供乙個全域性訪問點。(定義)
概念拆解:
(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;
}}
簡單模擬**計數功能
publicclass
singleton
}public
static singleton getinstance()//
方法,方法中去例項化類.}}
return
instance;
}}
在某個時候我只需要乙個執行緒去處理事務,不想有多個例項時。例如我們建立乙個資料庫訪問的管理類。類中有許多的方法。
publicclass
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...