程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 可以繼承的C++ Singleton基類

可以繼承的C++ Singleton基類

編輯:關於C語言
 

單例模式(Singleton Pattern)是設計模式中的一種,它用來保證系統中最多只能存在一個它的實例,其做法是由類自身來創建和持有它的對象實例,把對實例的創建權和管理權都控制在自己手中,以便控制實例數目。

關於如何在C++中實現單例模式的討論已經太多了,我只是簡單介紹一下可以繼承的單例類。

首先介紹一下通常所見的單例類的寫法,不妨設這個類叫做Singleton。

Singleton.h:
#ifndef _SINGLETON_H_
#define _SINGLETON_H_

#include

class Singleton
{
public:
static Singleton& GetInstance();

private:
Singleton();
~Singleton();

// Use auto_ptr to make sure that the allocated memory for instance
// will be released when program exits (after main() ends).
static std::auto_ptr s_instance;
friend class std::auto_ptr;

Singleton(const Singleton&);
Singleton& operator =(const Singleton&);
};

#endif
 

 

Singleton.cpp:

#include "Singleton.h"
#include
#include

using namespace std;
using namespace boost;

auto_ptr Singleton::s_instance;

Singleton::Singleton()
{
cout << "Construct Singleton" << endl;
}

Singleton::~Singleton()
{
cout << "Destruct Singleton" << endl;
}

Singleton& Singleton::GetInstance()
{
static mutex s_mutex;
if (s_instance.get() == NULL)
{
mutex::scoped_lock lock(s_mutex);
if (s_instance.get() == NULL)
{
s_instance.reset(new Singleton());
}
// 'lock' will be destructed now. 's_mutex' will be unlocked.
}
return *s_instance;
}
 

這個類寫的也不完美啦,比如雙重判定也會有失效的時候,不過湊合用吧,哈哈。不過話說boost庫裡也有singleton,我為什麼要自己寫個呢,無奈地飄過。

廢話不多說了,上面的單例類基本上解決了多線程安全問題、實例內存自動釋放問題,算是一段可以使用的程序。不過如果系統中有大量單例類(這時候也得好好考慮一下design有沒有問題),每個都要這麼寫一番豈不是很麻煩?要是可以寫一個單例基類,以後再創造單例類的時候直接繼承一下多方便啊。不過很明顯的問題就在那個static對象指針,這個用來保存唯一實例的靜態變量如果定義在基類裡面,那所有的子類都只能用這同一個變量來保存它們各自的實例了,社會主義國家總得讓每個子類都過上溫飽生活吧!  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved