设计模式学习之单件模式singleton
定義
????? 單件模式是一種用于確保整個應用程序中只有一個類實例且這個實例所占資源在整個應用程序中是共享的程序設計方法(根據實際情況,可能需要幾個類實例)。在某些情況下,這種程序設計方法是很有用處的。
單件模式應該使用在什么場合
??? 當需要控制一個類的實例數量且調用者可以從一個公共的眾所周知的訪問點訪問時。
單件模式類的創建
??? 我們分兩種方式來討論一個單件類的創建,一是將一個類的公共構造函數改為私有,另一種方式是保留類的公共構造函數,通過一個靜態成員來決定是否要返回一個類實例。
應用
??? 顧名思義,Singleton就是確保一個類只有唯一的一個實例。Singleton主要用于對象的創建,這意味著,如果某個類采用了Singleton模式,則在這個類被創建后,它將有且僅有一個實例可供訪問。很多時候我們都會需要Singleton模式,最常見的比如我們希望整個應用程序中只有一個連接數據庫的Connection實例;又比如要求一個應用程序中只存在某個用戶數據結構的唯一實例。我們都可以通過應用Singleton模式達到目的。
為什么不使用全局對象
??? 一眼看去,Singleton似乎有些像全局對象。但是實際上,并不能用全局對象代替Singleton模式,這是因為:其一,大量使用全局對象會使得程序質量降低,而且有些編程語言例如C#,根本就不支持全局變量。其二,全局對象的方法并不能阻止人們將一個類實例化多次:除了類的全局實例外,開發人員仍然可以通過類的構造函數創建類的多個局部實例。而Singleton模式則通過從根本上控制類的創建,將"保證只有一個實例"這個任務交給了類本身,開發人員不可能再有其它途徑得到類的多個實例。這一點是全局對象方法與Singleton模式的根本區別。
Singleton模式的實現要點
李林老師的例子
頭文件:
1 class CLLog2 {
3 public:
4 static CLLog* GetInstance();
5
6 private:
7 CLLog(const CLLog&);//復制構造函數
8 CLLog& operator=(const CLLog&);//"="操作符
9
10 CLLog();
11 virtual ~CLLog();
12
13 int m_Fd;//記錄文件描述符
14 static CLLog *m_pLog;
15 };
實現文件:
2
3 CLLog::CLLog()
4 {
5 m_Fd = open(LOG_FILE_NAME, O_RDWR | O_CREAT | O_APPEND, S_IRUSR);
6 }
7
8 CLLog::~CLLog()
9 {
10 if(m_Fd != -1)
11 close(m_Fd);//析構時關閉文件
12
13 if(m_pLog != 0)
14 delete m_pLog;//釋放業務對象占用的資源
15 }
16
17 CLLog* CLLog::GetInstance()
18 {
19 if(m_pLog == 0)
20 {
21 m_pLog = new CLLog;
22 }
23 return m_pLog;
24 }
一點自己的理解,這個類可以分為兩部分來看:一部分對外表現出靜態(static)特性,負責類的初始化、內部業務對象的創建、釋放等管理工作;另一部分就是內部業務對象,它是這個類提供的業務邏輯的實際執行者。
轉載于:https://www.cnblogs.com/lq0729/archive/2011/10/18/2216294.html
總結
以上是生活随笔為你收集整理的设计模式学习之单件模式singleton的全部內容,希望文章能夠幫你解決所遇到的問題。