沙狼的博客

————紫罗兰把它的香气留在踩扁了它的脚踝上,这就是宽恕

用户操作
[即时聊天] [发私信] [加为好友]
Martian
最近评论
algcfx:Wow gold
zhangjiajun1982:建议看看这篇文章会对你有帮助的 http://www.150it.cn/bianchengwendang/Cjia/350312.html
SIMON:老郑确实是不错,但一位地责怪中小学教育的同时,郑教授有没有想想中小学的教育都是以大学的招收条件为导向,如果大学的招生方式没有改变,中小学教育又怎么可能改变!从小学一年级甚至幼儿园我们就知道我们学习的目的是考上大学,但我们能做的只是根据大学的要求(高分)去学习,何谈素质教育。所以教学改革应该是至上而下的,而不是一位地责怪中小学的教育体制,应该从大学做起.
12345:我的设置也都没错,就是不晓得是哪里的问题,用输ip地址的方法就看的到共享,但是在网上邻居上就是怎么都看不到,不知道是怎么了.
lovepudding:路过,for:
紫罗兰把它的香气留在踩扁了它的脚踝上,这就是宽恕
文章分类
收藏
相册
朋友
奇妙的图片
我的收藏
CodeProject(RSS)
DotNet Tools(RSS)
Martin Fowler(RSS)
MorningSpace(RSS)
YuanQingFei(RSS)
zhengyun文章列表(RSS)
侯捷网站(RSS)
马维达-《C++网络编程》(RSS)
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 Singleton模式的C++实现研究(转载)收藏

新一篇: C++类型中的转换--static_cast 和 reinterpret_cast  | 旧一篇: 老鼠爱大米

Singleton模式的C++实现研究(示例代码)
作者game.19xz 来源19xz.com

[附件一:演示程序代码清单]

/*//////////////////////////////////////////////////////////////////

作者:张友邦

时间:2002年10月9日

描述:实现Singleton

/*//////////////////////////////////////////////////////////////////

 

#include <iostream.h>

#include <tchar.h>

 

////////////////////////////////////////////////////////////////////

//第一种实现(使用模板函数)

class MySingleton1

{

private:

    MySingleton1(){ cout << _T("Construct MySingleton1") << endl; }

    MySingleton1 & operator =(const MySingleton1&){}

    template <typename T>

    friend T& GetInstanceRef();

 

public:

    ~MySingleton1(){ cout << _T("Destroy MySingleton1") << endl; }

 

public:

    void DoSomething(){ cout << _T("Do something here in MySingleton1") << endl; }

};

template <typename T>

T& GetInstanceRef()

{

    static T _instance;

    return _instance;

}

template <typename T>

T* GetInstancePtr()

{

    return &GetInstanceRef<T>();

}

////////////////////////////////////////////////////////////////////

 

////////////////////////////////////////////////////////////////////

//第二种实现(使用模板类)

template <typename T>

class SingletonWraper

{

public:

    static T& GetInstanceRef()

    {

         static T _instance;

         return _instance;

    }

    static const T& GetInstanceConst()

    {

         return GetInstanceRef();

    }

    static T* GetInstancePtr()

    {

         return &GetInstanceRef();

    }

};

#define DEFINE_SINGLETON(ClassName); \

public: \

    friend class SingletonWraper<ClassName>; \

    typedef class SingletonWraper<ClassName> SingletonWraper; \

    typedef SingletonWraper SingletonInterface; \

private: \

    const ClassName& operator=(const ClassName&) \

    { \

         return SingletonInterface::GetInstanceRef(); \

    } \

    ClassName(const ClassName&); \

private: \

    static void operator delete(void *p, size_t n) \

    { \

         throw -1; \

    }//End of define DECLARE_SINGLETON(ClassName);

 

class MySingleton2

{

    DEFINE_SINGLETON(MySingleton2);

private:

    MySingleton2(){ cout << _T("Construct MySingleton2") << endl; }

 

public:

    ~MySingleton2(){ cout << _T("Destroy MySingleton2") << endl; }

public:

    void DoSomething(){ cout << _T("Do something here in MySingleton2") << "  " << endl; }

};

////////////////////////////////////////////////////////////////////

 

////////////////////////////////////////////////////////////////////

//第三种实现(由类自身实现,自动销毁对象,相比之下,它更简单)

#define DECLARE_SINGLETON(ClassName); \

public: \

    static ClassName& GetInstanceRef() \

    { \

         static ClassName _instance; \

         return _instance; \

    } \

    static const ClassName& GetInstanceConst() \

    { \

         return GetInstanceRef(); \

    } \

    static ClassName* GetInstancePtr() \

    { \

         return &GetInstanceRef(); \

    } \

    const ClassName& operator=(const ClassName&) \

    { \

         return GetInstanceRef(); \

    } \

private: \

    ClassName(const ClassName&); \

    static void operator delete(void *p, size_t n) \

    { \

         throw -1; \

    }//End of define DECLARE_SINGLETON(ClassName);

 

class MySingleton3

{

    DECLARE_SINGLETON(MySingleton3);

 

private:

    MySingleton3(){ cout << _T("Construct MySingleton3") << endl; ID = 0; }

 

public:

    int ID;

    ~MySingleton3(){ cout << _T("Destroy MySingleton3") << endl; }

    void DoSomething(){ cout << _T("Do something here in MySingleton3, ID = ") << ID << endl; }

};

////////////////////////////////////////////////////////////////////

 

////////////////////////////////////////////////////////////////////

//第四种实现(《Design Patterns》里的,做了一些修改)

//(由类自身实现,手动与自动销毁对象)

#define ALLOW_SINGLETON(ClassName); \

private: \

    static ClassName* _instance; \

 \

public: \

    static ClassName& GetInstanceRef() \

    { \

         if (_instance == 0) \

             _instance = new ClassName; \

         return *_instance; \

    } \

    static ClassName* GetInstancePtr() \

    { \

         return &GetInstanceRef(); \

    } \

    static ReleaseInstance() \

    { \

         if (_instance != 0) \

         { \

             delete _instance; \

             _instance = 0; \

         } \

    } //End of ALLOW_SINGLETON(ClassName);

 

#define IMPLEMENT_SINGLETON(ClassName); \

ClassName* ClassName::_instance = 0; \

static class DestructHelper_##ClassName \

{ \

public: \

    ~DestructHelper_##ClassName(){ ClassName::ReleaseInstance(); } \

} DestructHelperInstance_##ClassName;

//End of IMPLEMENT_SINGLE(ClassName);

 

class MySingleton4

{

private:

    MySingleton4(){ cout << _T("Construct MySingleton4") << endl; } //构造函数私有

    ~MySingleton4(){ cout << _T("Destroy MySingleton4") << endl; } //析构函数放哪里都可以

    ALLOW_SINGLETON(MySingleton4);

 

public:

    void DoSomething(){ cout << _T("Do something here in MySingleton4") << endl; }

};

IMPLEMENT_SINGLETON(MySingleton4);

////////////////////////////////////////////////////////////////////

 

////////////////////////////////////////////////////////////////////

//测试

void _tmain(int argc, char *argv[])

{

    //测试第一种实现

    cout << _T("**************Test of the first implementation***************") << endl;

    MySingleton1* myobj1;

    myobj1 = GetInstancePtr<MySingleton1>();

    myobj1->DoSomething();

    GetInstanceRef<MySingleton1>().DoSomething();

 

    //测试第二种实现

    cout << endl << _T("**************Test of the second implementation**************") << endl;

    MySingleton2* myobj2;

    myobj2 = SingletonWraper<MySingleton2>::GetInstancePtr();

    myobj2->DoSomething();

    //MySingleton2 myobj22(*myobj2); //Error

    MySingleton2::SingletonInterface::GetInstanceRef().DoSomething();

 

    //测试第三种实现

    cout << endl << _T("**************Test of the third implementation***************") << endl;

    MySingleton3 *myobj3 = MySingleton3::GetInstancePtr();

    myobj3->ID = 1;

    myobj3->DoSomething();

    MySingleton3& myobj33 = MySingleton3::GetInstanceRef();

    myobj33 = *myobj3;

    try

    {

         delete myobj3;

    }

    catch(...)

    {

         cout << _T("Your object cannot be deleted.") << endl;

    }

    myobj33.ID = 2;

    myobj33.DoSomething();

    myobj3->DoSomething();

 

    //测试第四种实现

    cout << endl << _T("**************Test of the fourth implementation**************") << endl;

    MySingleton4 *myobj4 = MySingleton4::GetInstancePtr();

    myobj4->DoSomething();

    MySingleton4::GetInstanceRef().DoSomething();

 

    cout << _T("**********************End of all testing*********************") << endl << endl;

    cout << _T("Following is the Automatic Garbage Collection process:") << endl << endl;

}

////////////////////////////////////////////////////////////////////

 

[附件二:演示程序运行结果]

**************Test of the first implementation***************

Construct MySingleton1

Do something here in MySingleton1

Do something here in MySingleton1

 

**************Test of the second implementation**************

Construct MySingleton2

Do something here in MySingleton2

Do something here in MySingleton2

 

**************Test of the third implementation***************

Construct MySingleton3

Do something here in MySingleton3, ID = 1

Destroy MySingleton3

Your object cannot be deleted.

Do something here in MySingleton3, ID = 2

Do something here in MySingleton3, ID = 2

 

**************Test of the fourth implementation**************

Construct MySingleton4

Do something here in MySingleton4

Do something here in MySingleton4

**********************End of all testing*********************

 

Following is the Automatic Garbage Collection process:

 

Destroy MySingleton3

Destroy MySingleton2

Destroy MySingleton1

Destroy MySingleton4



发表于 @ 2004年12月03日 14:28:00|评论(loading...)|编辑

新一篇: C++类型中的转换--static_cast 和 reinterpret_cast  | 旧一篇: 老鼠爱大米

评论:没有评论。

发表评论  


登录
Csdn Blog version 3.1a
Copyright © Martian