[附件一:演示程序代码清单]<?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模式需要注意几个关键点,包括线程安全、内存管理和模板化以提高复用性。 1. **线程安全**:在多线程环境下,如果多个线程同时尝试创建Singleton实例,可能会导致创建多个对象。为了保证线程...
C++实现Singleton单例模式 本文档将详细介绍如何使用C++语言实现设计模式中的单例模式。单例模式是一种常用的设计模式,它可以确保一个类只能实例化一次。 单例模式的定义: 单例模式是一种创建型模式,它可以确保...
下面是一个简单的C++单例模式实现示例: ```cpp class Singleton { private: Singleton() {} // 私有构造函数 static Singleton* instance; // 静态成员变量 public: static Singleton* getInstance() { // ...
在给出的描述中提到“Java的Singleton模式代码”,这提示我们主要关注于如何通过不同的实现方式来创建一个符合Singleton模式的Java类。接下来,我们将详细探讨几种常见的Singleton实现方式及其优缺点。 #### 二、...
以上代码展示了如何在C++和Python中实现单例模式。值得注意的是,C++的实现需要考虑多线程环境下的线程安全问题,可能需要使用互斥锁(mutex)来保证在并发环境中正确地创建单例。而Python的实现则天然具有线程安全...
设计模式是软件工程中的一种最佳实践,它是在特定情境下为解决常见...通过C++实现的示例代码,可以更直观地理解每种模式的工作原理和使用场景。在学习过程中,建议结合具体应用场景,逐步加深对设计模式的理解和应用。
在给定的文件"Singleton"中,可能包含了以上所述的Singleton模式的实现代码,以及如何在多线程环境下保证其正确性的示例。通过分析和学习这段代码,我们可以更深入地理解Singleton模式的实现细节和在并发环境中的...
在实际开发过程中,正确理解和运用Singleton模式对于提高代码质量和系统性能有着重要意义。 #### 二、Singleton模式的基本原理 Singleton模式的核心思想是限制类的实例化过程,确保任何时候都只存在一个实例。为了...
3. **Singleton模式**:单例模式确保一个类只有一个实例,并提供一个全局访问点。在C++中,通常通过私有构造函数和静态成员变量来实现。 4. **Builder模式**:建造者模式将复杂对象的构建与其表示分离,使得同样的...
一种常见的C++单例模式实现方式是使用静态成员变量和私有构造函数: ```cpp #include class Singleton { private: Singleton() {} // 私有构造函数 static Singleton* instance; // 静态成员变量 public: ...
《C++设计模式:深入解析Singleton模式》 Singleton模式,作为设计模式中最为经典的一种,是一种创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。在C++编程中,Singleton模式的应用...
【标题】"C++、MFC源代码Singleton_demo"是一个示例项目,它演示了如何在C++和Microsoft Foundation Classes (MFC)框架下实现单例设计模式。单例模式是一种常用的软件设计模式,用于确保一个类只有一个实例,并提供...
很多开发人员在刚开始学Python 时,都考虑过像 c++ 那样来实现 singleton 模式,但后来会发现 c++ 是 c++,Python 是 Python,不能简单的进行模仿。 Python 中常见的方法是借助 global 变量,或者 class 变量来实现...
本文旨在深入解析GoF(Gang of Four,四人组)提出的23种设计模式,并提供相应的C++实现示例代码。通过这种方式,读者不仅能理解每种设计模式的核心概念,还能了解如何在实际开发中应用这些模式。 #### 1. 创建型...
本专题涵盖了多种设计模式的示例代码,包括Python和C++两种编程语言实现,旨在帮助开发者更好地理解和应用这些模式。 1. **Builder模式**:Builder模式是一种创建型设计模式,它提供了一种创建对象的抽象方法,使得...
【Head First 设计模式】以C++代码的方式写出各种模式实现示例.zip 以C++代码的方式写出常用设计模式实现示例,便于理解。 策略模式(Strategy) 观察者模式(Observer) 装饰者模式(Decorator) 简单工厂模式(Simple...
C++源代码的提供使得读者可以直接运行和研究示例,加深对设计模式的理解。《GoF 23种设计模式解析附C++实现源码(2nd Edition)》是一本不可多得的参考书籍,适合于任何希望深入理解面向对象设计原则的软件工程师。
这是关于设计模式的c++代码,涵盖了abstractFactory, Builder, Adapter, Components,Singleton,Prototype,Bridge 还有未完的部分 将下次再传。