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

[附件一:演示程序代码清单]<o:p></o:p>

/*//<o:p></o:p>

作者:张友邦<o:p></o:p>

时间:2002年10月9日<o:p></o:p>

描述:实现Singleton<o:p></o:p>

/*//<o:p></o:p>

 <o:p></o:p>

#include <iostream.h><o:p></o:p>

#include <tchar.h><o:p></o:p>

 <o:p></o:p>

<o:p></o:p>

//第一种实现(使用模板函数)<o:p></o:p>

class MySingleton1<o:p></o:p>

{<o:p></o:p>

private:<o:p></o:p>

    MySingleton1(){ cout << _T("Construct MySingleton1") << endl; }<o:p></o:p>

    MySingleton1 & operator =(const MySingleton1&){}<o:p></o:p>

    template <typename T><o:p></o:p>

    friend T& GetInstanceRef();<o:p></o:p>

 <o:p></o:p>

public:<o:p></o:p>

    ~MySingleton1(){ cout << _T("Destroy MySingleton1") << endl; }<o:p></o:p>

 <o:p></o:p>

public:<o:p></o:p>

    void DoSomething(){ cout << _T("Do something here in MySingleton1") << endl; }<o:p></o:p>

};<o:p></o:p>

template <typename T><o:p></o:p>

T& GetInstanceRef()<o:p></o:p>

{<o:p></o:p>

    static T _instance;<o:p></o:p>

    return _instance;<o:p></o:p>

}<o:p></o:p>

template <typename T><o:p></o:p>

T* GetInstancePtr()<o:p></o:p>

{<o:p></o:p>

    return &GetInstanceRef<T>();<o:p></o:p>

}<o:p></o:p>

<o:p></o:p>

 <o:p></o:p>

<o:p></o:p>

//第二种实现(使用模板类)<o:p></o:p>

template <typename T><o:p></o:p>

class SingletonWraper<o:p></o:p>

{<o:p></o:p>

public:<o:p></o:p>

    static T& GetInstanceRef()<o:p></o:p>

    {<o:p></o:p>

         static T _instance;<o:p></o:p>

         return _instance;<o:p></o:p>

    }<o:p></o:p>

    static const T& GetInstanceConst()<o:p></o:p>

    {<o:p></o:p>

         return GetInstanceRef();<o:p></o:p>

    }<o:p></o:p>

    static T* GetInstancePtr()<o:p></o:p>

    {<o:p></o:p>

         return &GetInstanceRef();<o:p></o:p>

    }<o:p></o:p>

};<o:p></o:p>

#define DEFINE_SINGLETON(ClassName); \<o:p></o:p>

public: \<o:p></o:p>

    friend class SingletonWraper<ClassName>; \<o:p></o:p>

    typedef class SingletonWraper<ClassName> SingletonWraper; \<o:p></o:p>

    typedef SingletonWraper SingletonInterface; \<o:p></o:p>

private: \<o:p></o:p>

    const ClassName& operator=(const ClassName&) \<o:p></o:p>

    { \<o:p></o:p>

         return SingletonInterface::GetInstanceRef(); \<o:p></o:p>

    } \<o:p></o:p>

    ClassName(const ClassName&); \<o:p></o:p>

private: \<o:p></o:p>

    static void operator delete(void *p, size_t n) \<o:p></o:p>

    { \<o:p></o:p>

         throw -1; \<o:p></o:p>

    }//End of define DECLARE_SINGLETON(ClassName);<o:p></o:p>

 <o:p></o:p>

class MySingleton2<o:p></o:p>

{<o:p></o:p>

    DEFINE_SINGLETON(MySingleton2);<o:p></o:p>

private:<o:p></o:p>

    MySingleton2(){ cout << _T("Construct MySingleton2") << endl; }<o:p></o:p>

 <o:p></o:p>

public:<o:p></o:p>

    ~MySingleton2(){ cout << _T("Destroy MySingleton2") << endl; }<o:p></o:p>

public:<o:p></o:p>

    void DoSomething(){ cout << _T("Do something here in MySingleton2") << "  " << endl; }<o:p></o:p>

};<o:p></o:p>

<o:p></o:p>

 <o:p></o:p>

<o:p></o:p>

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

#define DECLARE_SINGLETON(ClassName); \<o:p></o:p>

public: \<o:p></o:p>

    static ClassName& GetInstanceRef() \<o:p></o:p>

    { \<o:p></o:p>

         static ClassName _instance; \<o:p></o:p>

         return _instance; \<o:p></o:p>

    } \<o:p></o:p>

    static const ClassName& GetInstanceConst() \<o:p></o:p>

    { \<o:p></o:p>

         return GetInstanceRef(); \<o:p></o:p>

    } \<o:p></o:p>

    static ClassName* GetInstancePtr() \<o:p></o:p>

    { \<o:p></o:p>

         return &GetInstanceRef(); \<o:p></o:p>

    } \<o:p></o:p>

    const ClassName& operator=(const ClassName&) \<o:p></o:p>

    { \<o:p></o:p>

         return GetInstanceRef(); \<o:p></o:p>

    } \<o:p></o:p>

private: \<o:p></o:p>

    ClassName(const ClassName&); \<o:p></o:p>

    static void operator delete(void *p, size_t n) \<o:p></o:p>

    { \<o:p></o:p>

         throw -1; \<o:p></o:p>

    }//End of define DECLARE_SINGLETON(ClassName);<o:p></o:p>

 <o:p></o:p>

class MySingleton3<o:p></o:p>

{<o:p></o:p>

    DECLARE_SINGLETON(MySingleton3);<o:p></o:p>

 <o:p></o:p>

private:<o:p></o:p>

    MySingleton3(){ cout << _T("Construct MySingleton3") << endl; ID = 0; }<o:p></o:p>

 <o:p></o:p>

public:<o:p></o:p>

    int ID;<o:p></o:p>

    ~MySingleton3(){ cout << _T("Destroy MySingleton3") << endl; }<o:p></o:p>

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

};<o:p></o:p>

<o:p></o:p>

 <o:p></o:p>

<o:p></o:p>

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

//(由类自身实现,手动与自动销毁对象)<o:p></o:p>

#define ALLOW_SINGLETON(ClassName); \<o:p></o:p>

private: \<o:p></o:p>

    static ClassName* _instance; \<o:p></o:p>

 \<o:p></o:p>

public: \<o:p></o:p>

    static ClassName& GetInstanceRef() \<o:p></o:p>

    { \<o:p></o:p>

         if (_instance == 0) \<o:p></o:p>

             _instance = new ClassName; \<o:p></o:p>

         return *_instance; \<o:p></o:p>

    } \<o:p></o:p>

    static ClassName* GetInstancePtr() \<o:p></o:p>

    { \<o:p></o:p>

         return &GetInstanceRef(); \<o:p></o:p>

    } \<o:p></o:p>

    static ReleaseInstance() \<o:p></o:p>

    { \<o:p></o:p>

         if (_instance != 0) \<o:p></o:p>

         { \<o:p></o:p>

             delete _instance; \<o:p></o:p>

             _instance = 0; \<o:p></o:p>

         } \<o:p></o:p>

    } //End of ALLOW_SINGLETON(ClassName);<o:p></o:p>

 <o:p></o:p>

#define IMPLEMENT_SINGLETON(ClassName); \<o:p></o:p>

ClassName* ClassName::_instance = 0; \<o:p></o:p>

static class DestructHelper_##ClassName \<o:p></o:p>

{ \<o:p></o:p>

public: \<o:p></o:p>

    ~DestructHelper_##ClassName(){ ClassName::ReleaseInstance(); } \<o:p></o:p>

} DestructHelperInstance_##ClassName;<o:p></o:p>

//End of IMPLEMENT_SINGLE(ClassName);<o:p></o:p>

 <o:p></o:p>

class MySingleton4<o:p></o:p>

{<o:p></o:p>

private:<o:p></o:p>

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

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

    ALLOW_SINGLETON(MySingleton4);<o:p></o:p>

 <o:p></o:p>

public:<o:p></o:p>

    void DoSomething(){ cout << _T("Do something here in MySingleton4") << endl; }<o:p></o:p>

};<o:p></o:p>

IMPLEMENT_SINGLETON(MySingleton4);<o:p></o:p>

<o:p></o:p>

 <o:p></o:p>

<o:p></o:p>

//测试<o:p></o:p>

void _tmain(int argc, char *argv[])<o:p></o:p>

{<o:p></o:p>

    //测试第一种实现<o:p></o:p>

    cout << _T("**************Test of the first implementation***************") << endl;<o:p></o:p>

    MySingleton1* myobj1;<o:p></o:p>

    myobj1 = GetInstancePtr<MySingleton1>();<o:p></o:p>

    myobj1->DoSomething();<o:p></o:p>

    GetInstanceRef<MySingleton1>().DoSomething();<o:p></o:p>

 <o:p></o:p>

    //测试第二种实现<o:p></o:p>

    cout << endl << _T("**************Test of the second implementation**************") << endl;<o:p></o:p>

    MySingleton2* myobj2;<o:p></o:p>

    myobj2 = SingletonWraper<MySingleton2>::GetInstancePtr();<o:p></o:p>

    myobj2->DoSomething();<o:p></o:p>

    //MySingleton2 myobj22(*myobj2); //Error<o:p></o:p>

    MySingleton2::SingletonInterface::GetInstanceRef().DoSomething();<o:p></o:p>

 <o:p></o:p>

    //测试第三种实现<o:p></o:p>

    cout << endl << _T("**************Test of the third implementation***************") << endl;<o:p></o:p>

    MySingleton3 *myobj3 = MySingleton3::GetInstancePtr();<o:p></o:p>

    myobj3->ID = 1;<o:p></o:p>

    myobj3->DoSomething();<o:p></o:p>

    MySingleton3& myobj33 = MySingleton3::GetInstanceRef();<o:p></o:p>

    myobj33 = *myobj3;<o:p></o:p>

    try<o:p></o:p>

    {<o:p></o:p>

         delete myobj3;<o:p></o:p>

    }<o:p></o:p>

    catch(...)<o:p></o:p>

    {<o:p></o:p>

         cout << _T("Your object cannot be deleted.") << endl;<o:p></o:p>

    }<o:p></o:p>

    myobj33.ID = 2;<o:p></o:p>

    myobj33.DoSomething();<o:p></o:p>

    myobj3->DoSomething();<o:p></o:p>

 <o:p></o:p>

    //测试第四种实现<o:p></o:p>

    cout << endl << _T("**************Test of the fourth implementation**************") << endl;<o:p></o:p>

    MySingleton4 *myobj4 = MySingleton4::GetInstancePtr();<o:p></o:p>

    myobj4->DoSomething();<o:p></o:p>

    MySingleton4::GetInstanceRef().DoSomething();<o:p></o:p>

 <o:p></o:p>

    cout << _T("**********************End of all testing*********************") << endl << endl;<o:p></o:p>

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

}<o:p></o:p>

<o:p></o:p>

 <o:p></o:p>

[附件二:演示程序运行结果]<o:p></o:p>

**************Test of the first implementation***************<o:p></o:p>

Construct MySingleton1<o:p></o:p>

Do something here in MySingleton1<o:p></o:p>

Do something here in MySingleton1<o:p></o:p>

 <o:p></o:p>

**************Test of the second implementation**************<o:p></o:p>

Construct MySingleton2<o:p></o:p>

Do something here in MySingleton2<o:p></o:p>

Do something here in MySingleton2<o:p></o:p>

 <o:p></o:p>

**************Test of the third implementation***************<o:p></o:p>

Construct MySingleton3<o:p></o:p>

Do something here in MySingleton3, ID = 1<o:p></o:p>

Destroy MySingleton3<o:p></o:p>

Your object cannot be deleted.<o:p></o:p>

Do something here in MySingleton3, ID = 2<o:p></o:p>

Do something here in MySingleton3, ID = 2<o:p></o:p>

 <o:p></o:p>

**************Test of the fourth implementation**************<o:p></o:p>

Construct MySingleton4<o:p></o:p>

Do something here in MySingleton4<o:p></o:p>

Do something here in MySingleton4<o:p></o:p>

**********************End of all testing*********************<o:p></o:p>

 <o:p></o:p>

Following is the Automatic Garbage Collection process:<o:p></o:p>

 <o:p></o:p>

Destroy MySingleton3<o:p></o:p>

Destroy MySingleton2<o:p></o:p>

Destroy MySingleton1<o:p></o:p>

Destroy MySingleton4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值