Singleton模式的C++实现研究(示例代码)

原创 2002年10月24日 10:35:00

[附件一:演示程序代码清单]<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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

作者:张友邦

时间: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

【Singleton】单例模式及常见的6种写法—宁可饥饿也不偷懒

单例模式大家并不陌生,分为懒汉式、饿汉式之类的。它们是有些细微的不同,下面就一点一点告诉你们这俩汉子有嘛不同   下面是一个简单的小实例: //简单懒汉式 public class Singleton...
  • knockheart
  • knockheart
  • 2013年06月19日 11:46
  • 2707

Java 写一个单例模式(Singleton)出来

第一种:饱汉模式 public class SingleTon {  private SingleTon(){ } //实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间 ...
  • zpf336
  • zpf336
  • 2014年09月25日 21:41
  • 7719

C++完美实现Singleton模式

Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却也不是件容易的事情。 1.         标准的实现 class Singleton { public:        ...
  • u012786754
  • u012786754
  • 2014年12月19日 18:25
  • 1493

C++单例模式示例代码

  • 2015年09月29日 18:21
  • 2KB
  • 下载

设计模式C++版示例代码

  • 2011年07月17日 10:50
  • 766KB
  • 下载

设计模式c++语言,示例代码

  • 2013年12月20日 17:23
  • 925KB
  • 下载

QT C++实现多线程通信--示例代码

先占坑,回头慢慢写!
  • lisarer
  • lisarer
  • 2016年07月11日 11:45
  • 239

[转载]iOS6新特征:UICollectionView官方使用示例代码研究

原文地址:iOS6新特征:UICollectionView官方使用示例代码研究作者:浪友dans 注:这里是iOS6新特征汇总贴链接 iOS6新特征:参考资料和示例汇总   这个链接可...
  • kemanlam
  • kemanlam
  • 2014年04月15日 11:14
  • 349

iOS6新特征:UICollectionView官方使用示例代码研究

由于UICollectionView功能比较强大,在此,我们深入学习一下UICollectionView的官方使用示例代码,顺与大家分享一下心得。  一、获取官方示例代码 官方使用示例代码...
  • LRtianzhilan
  • LRtianzhilan
  • 2013年09月18日 01:00
  • 830

iOS6新特征:UICollectionView官方使用示例代码研究

由于UICollectionView功能比较强大,在此,我们深入学习一下UICollectionView的官方使用示例代码,顺与大家分享一下心得。  一、获取官方示例代码 官方使用示例代码...
  • abc4715760
  • abc4715760
  • 2014年11月13日 23:20
  • 387
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Singleton模式的C++实现研究(示例代码)
举报原因:
原因补充:

(最多只允许输入30个字)