单例模式的几种写法
2016-03-01 20:17
246 查看
设计模式作为软件设计开发中的一种思想,在开发中占据一个很重要的地位。通过使用设计模式封装代码,可以使我们的代码具备较高的升级维护性,开发也会更方便快捷清晰。其中单例模式是用的比较多,其作用在于保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式的实现并不难,只需把构造函数声明为静态私有的,通过函数去实例化,或者定义的时候实例化即可,其中函数也要定义为静态的,代码如下:
上面的两种单例模式实现方法,其中懒汉式单例模式是要到第一次使用时才实例化,用时间换空间;而饿汉式单例模式则一开始就实例化,用空间换时间。
要注意的是懒汉式单例模式在多线程模式下要考虑多线程安全问题,要给它加个锁,达到单一访问的要求,饿汉式单例模式则无此要求。
线程安全的懒汉式单例模式代码如下:
class Singleton
{
public:
static Singleton* CreateInstance()
{
if (m_pSingleton == NULL)
{
lock(); //锁函数,可以用临界区来实现,这里为了代码简洁就不写了
if (m_pSingleton == NULL)
{
return new Singleton();
}
}
return m_pSingleton;
}
private:
Singleton();
//把拷贝构造函数,赋值函数都声明为私有,防止复制
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
static Singleton *m_pSingleton;
};
单例模式的实现并不难,只需把构造函数声明为静态私有的,通过函数去实例化,或者定义的时候实例化即可,其中函数也要定义为静态的,代码如下:
/*懒汉式单例模式,*/ class Singleton { public: static Singleton* CreateInstance() { if (m_pSingleton == NULL) { return new Singleton(); } return m_pSingleton; } private: Singleton(); //把拷贝构造函数,赋值函数都声明为私有,防止复制 Singleton(const Singleton&); Singleton& operator=(const Singleton&); static Singleton *m_pSingleton; }; /*饿汉式单例模式*/ class Singleton { public: static Singleton* CreateInstance() { r 4000 eturn m_pSingleton; } private: Singleton(); //把拷贝构造函数,赋值函数都声明为私有,防止复制 Singleton(const Singleton&); Singleton& operator=(const Singleton&); static Singleton *m_pSingleton; }; Singleton* Singleton::m_pSingleton = new Singleton();
上面的两种单例模式实现方法,其中懒汉式单例模式是要到第一次使用时才实例化,用时间换空间;而饿汉式单例模式则一开始就实例化,用空间换时间。
要注意的是懒汉式单例模式在多线程模式下要考虑多线程安全问题,要给它加个锁,达到单一访问的要求,饿汉式单例模式则无此要求。
线程安全的懒汉式单例模式代码如下:
class Singleton
{
public:
static Singleton* CreateInstance()
{
if (m_pSingleton == NULL)
{
lock(); //锁函数,可以用临界区来实现,这里为了代码简洁就不写了
if (m_pSingleton == NULL)
{
return new Singleton();
}
}
return m_pSingleton;
}
private:
Singleton();
//把拷贝构造函数,赋值函数都声明为私有,防止复制
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
static Singleton *m_pSingleton;
};
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- 应用领航:盘点那些年我们一起追过的OS
- 无奇不有!盘点各国自己开发的操作系统
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 可自定义oem的萝卜家园 Ghost XP 新春装机版 V200801 下载
- C#实现判断操作系统是否为Win8以上版本
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法