`
javasee
  • 浏览: 961144 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

[附件一:演示程序代码清单]<?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

分享到:
评论

相关推荐

    C++完美实现Singleton模式

    在C++中,实现Singleton模式需要注意几个关键点,包括线程安全、内存管理和模板化以提高复用性。 1. **线程安全**:在多线程环境下,如果多个线程同时尝试创建Singleton实例,可能会导致创建多个对象。为了保证线程...

    C++实现Singleton单例模式

    C++实现Singleton单例模式 本文档将详细介绍如何使用C++语言实现设计模式中的单例模式。单例模式是一种常用的设计模式,它可以确保一个类只能实例化一次。 单例模式的定义: 单例模式是一种创建型模式,它可以确保...

    C++单例模式示例代码

    下面是一个简单的C++单例模式实现示例: ```cpp class Singleton { private: Singleton() {} // 私有构造函数 static Singleton* instance; // 静态成员变量 public: static Singleton* getInstance() { // ...

    Java的Singleton模式代码(免资源分)

    在给出的描述中提到“Java的Singleton模式代码”,这提示我们主要关注于如何通过不同的实现方式来创建一个符合Singleton模式的Java类。接下来,我们将详细探讨几种常见的Singleton实现方式及其优缺点。 #### 二、...

    设计模式单例模式示例代码(python--c++)

    以上代码展示了如何在C++和Python中实现单例模式。值得注意的是,C++的实现需要考虑多线程环境下的线程安全问题,可能需要使用互斥锁(mutex)来保证在并发环境中正确地创建单例。而Python的实现则天然具有线程安全...

    23种设计模式C++示例代码

    设计模式是软件工程中的一种最佳实践,它是在特定情境下为解决常见...通过C++实现的示例代码,可以更直观地理解每种模式的工作原理和使用场景。在学习过程中,建议结合具体应用场景,逐步加深对设计模式的理解和应用。

    Singleton模式源程序

    在给定的文件"Singleton"中,可能包含了以上所述的Singleton模式的实现代码,以及如何在多线程环境下保证其正确性的示例。通过分析和学习这段代码,我们可以更深入地理解Singleton模式的实现细节和在并发环境中的...

    最简单的设计模式学习Singleton模式

    在实际开发过程中,正确理解和运用Singleton模式对于提高代码质量和系统性能有着重要意义。 #### 二、Singleton模式的基本原理 Singleton模式的核心思想是限制类的实例化过程,确保任何时候都只存在一个实例。为了...

    C++ 23种设计模式1

    3. **Singleton模式**:单例模式确保一个类只有一个实例,并提供一个全局访问点。在C++中,通常通过私有构造函数和静态成员变量来实现。 4. **Builder模式**:建造者模式将复杂对象的构建与其表示分离,使得同样的...

    设计模式专题之(一)单例模式---设计模式单例模式模式示例代码(python--c++)

    一种常见的C++单例模式实现方式是使用静态成员变量和私有构造函数: ```cpp #include class Singleton { private: Singleton() {} // 私有构造函数 static Singleton* instance; // 静态成员变量 public: ...

    C++设计模式代码资源12_Singleton.zip

    《C++设计模式:深入解析Singleton模式》 Singleton模式,作为设计模式中最为经典的一种,是一种创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。在C++编程中,Singleton模式的应用...

    C++、MFC源代码Singleton_demo

    【标题】"C++、MFC源代码Singleton_demo"是一个示例项目,它演示了如何在C++和Microsoft Foundation Classes (MFC)框架下实现单例设计模式。单例模式是一种常用的软件设计模式,用于确保一个类只有一个实例,并提供...

    Python下singleton模式的实现方法

    很多开发人员在刚开始学Python 时,都考虑过像 c++ 那样来实现 singleton 模式,但后来会发现 c++ 是 c++,Python 是 Python,不能简单的进行模仿。 Python 中常见的方法是借助 global 变量,或者 class 变量来实现...

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码

    本文旨在深入解析GoF(Gang of Four,四人组)提出的23种设计模式,并提供相应的C++实现示例代码。通过这种方式,读者不仅能理解每种设计模式的核心概念,还能了解如何在实际开发中应用这些模式。 #### 1. 创建型...

    设计模式专题---设计模式示例代码(全)(python--c++)

    本专题涵盖了多种设计模式的示例代码,包括Python和C++两种编程语言实现,旨在帮助开发者更好地理解和应用这些模式。 1. **Builder模式**:Builder模式是一种创建型设计模式,它提供了一种创建对象的抽象方法,使得...

    【Head First 设计模式】以C++代码的方式写出各种模式实现示例.zip

    【Head First 设计模式】以C++代码的方式写出各种模式实现示例.zip 以C++代码的方式写出常用设计模式实现示例,便于理解。 策略模式(Strategy) 观察者模式(Observer) 装饰者模式(Decorator) 简单工厂模式(Simple...

    GoF 23种设计模式解析附C++实现源码(2nd Edition)

    C++源代码的提供使得读者可以直接运行和研究示例,加深对设计模式的理解。《GoF 23种设计模式解析附C++实现源码(2nd Edition)》是一本不可多得的参考书籍,适合于任何希望深入理解面向对象设计原则的软件工程师。

    设计模式 c++ 代码示例

    这是关于设计模式的c++代码,涵盖了abstractFactory, Builder, Adapter, Components,Singleton,Prototype,Bridge 还有未完的部分 将下次再传。

Global site tag (gtag.js) - Google Analytics