单例设计模式
什么是单例模式
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
为什么使用单例模式
在应用系统开发中,我们常常有以下需求:
1.需要生成唯一序列的环境
2.需要频繁实例化然后销毁的对象。
3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
4.方便资源相互通信的环境
实际案例:
- 多线程中网络资源初始化
- 回收站机制
- 任务管理器
- 应用程序日志管理
- …
单例模式实现步骤
- 构造函数私有化
- 提供一个全局的静态方法,访问唯一对象
- 类中定义一个静态指针,指向唯一对象
单例模式实现代码
懒汉式
#include <iostream>
using namespace std;
//懒汉式
class SingleTon
{
private:SingleTon();
public:static SingleTon* m_singleTon;static SingleTon* GetInstance();void TestPrint();
};
//懒汉式并没有创建单例对象
SingleTon* SingleTon::m_singleTon = NULL;
int main()
{SingleTon* p1 = SingleTon::GetInstance();SingleTon* p2 = SingleTon::GetInstance();cout << "p1:"<< hex << p1 << endl;cout << "p2:" << hex << p2 << endl;p1->TestPrint();p2->TestPrint();return 0;
}
SingleTon::SingleTon()
{m_singleTon = NULL;cout << "构造了对象....." << endl;
}
SingleTon* SingleTon::GetInstance()
{if (m_singleTon == NULL) {m_singleTon = new SingleTon;}return m_singleTon;
}
void SingleTon::TestPrint()
{cout << "测试调用....." << endl;
}
饿汉式
#include <iostream>
using namespace std;
//懒汉式
class SingleTon
{
private:SingleTon();
public:static SingleTon* m_singleTon;static SingleTon* GetInstance();void TestPrint();
};
//饿汉式创建单例对象
SingleTon* SingleTon::m_singleTon = new SingleTon;
int main()
{SingleTon* p1 = SingleTon::GetInstance();SingleTon* p2 = SingleTon::GetInstance();cout << "p1:"<< hex << p1 << endl;cout << "p2:" << hex << p2 << endl;p1->TestPrint();p2->TestPrint();return 0;
}
SingleTon::SingleTon()
{m_singleTon = NULL;cout << "构造了对象....." << endl;
}
SingleTon* SingleTon::GetInstance()
{return m_singleTon;
}
void SingleTon::TestPrint()
{cout << "测试调用....." << endl;
}
单例模式优缺点
优点:
- 在内存中只有一个对象,节省内存空间;
- 避免频繁的创建销毁对象,可以提高性能;
- 避免对共享资源的多重占用,简化访问;
- 为整个系统提供一个全局访问点。
缺点:
- 不适用于变化频繁的对象;
- 如果实例化的对象长时间用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;