C++設計模式:Singleton的模板實現之一 (轉)

worldblog發表於2007-12-12
C++設計模式:Singleton的模板實現之一 (轉)[@more@]

題目:C++設計:Singleton的模板實現之一
型別:原創

作者:古斌亮
時間:2002.12.25
E : @163.com">KingLinux@163.com

 在/"> 和天極網 看了兩篇關於設計模式:Singleton的C++實現的文章,
自覺的學到不少東西(:)),在這裡我也寫了一個C++模板的實現之一,望各位大蝦多多指教,也希望可以達到拋磚引玉的作用.

 關於的Singleton的原理可以參考天極網《C++設計模式之Singleton》或中的《Singleton模式的C++實現研究》或是書本《設計模式》,這裡就不說了,請多包涵!

 翠花,上程式碼!

/////////////////////////////////
//singleton template file
//SingleEx.h

#ifndef SINGLETONEX__H__
#define SINGLETONEX__H__

//File Name : SingletonEx.h
//作用  : 提供單件模板功能(singleton template)
//Copyright(C) C++
// Visual C++ 6.0 , GCC Ver2.95.3-6 編譯透過
//作者:古斌亮
//時間:2002.12.25
// :

template
class CSingletonBase
{
protected:
 inline static T* Create(void)
 {
 if(m_pt==NULL)
 {
 m_pt=new T();
 }
 return m_pt;
 }

 inline static void Free(void)
 {
 delete m_pt;
 m_pt=NULL;
 }

protected:
 CSingletonBase()
 {
 }

 virtual ~CSingletonBase()
 {
 delete m_pt;
 }

private:
 CSingletonBase(const CSingletonBase& sig)
 {
 }

 CSingletonBase& operator = (const CSingletonBase& sig)
 {
 }

private:
 static T * m_pt;
};

template
T* CSingletonBase::m_pt = NULL;

template
class CSingletonEx : private CSingletonBase
{
public:
 CSingletonEx()
 {
 }

 virtual ~CSingletonEx()
 { 
 }

public:
 virtual T* Instance(void)
 {
 return CSingletonBase::Create();
 }

 virtual void Release(void)
 {
 CSingletonBase::Free();
 }

private:
 CSingletonEx(const CSingletonEx& sig)
 {
 }

 CSingletonEx& operator = (const CSingletonEx& sig)
 {
 }
};

#endif //SINGLETONEX__H__


////////////////////////////////
//測試類
//Doc.h

#ifndef CDOC__H__
#define CDOC__H__

class CDoc //測試類
{
public:
 CDoc(const std::string name = "NoName"):m_name(name){}
 virtual ~CDoc(){}

public:
 inline
 std::string Name()
 {
 return m_name;
 }

 inline
 void SetName(const std::string& name)
 {
 m_name=name;
 }

protected:
 std::string m_name;
};

#endif //CDOC__H__

////////////////////////////////////
//測試
//main.cpp

#include
#include
#include "singletonex.h"
#include "doc.h"

void TestSingletonEx(void)
{
 CSingletonEx s;

 CDoc *pdoc = s.Instance();

 std::cout<Name()<<:endl>

 pdoc->SetName("pdoc change:  My SingletonEx");

 CDoc *p2 = s.Instance();

 std::cout<Name()<<:endl>

 p2->SetName("p2 change: SingletonEx ");

 std::cout<Name()<<:endl>}

void main(void)
{
 std::cout< TestSingletonEx();
}

//the end!!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992355/,如需轉載,請註明出處,否則將追究法律責任。

相關文章