一、单例模式
定义:只能创建出一个类对象(只有一个实际的实例)的叫单例模式
- 单例模式的应用:
- Window系统的任务管理器
- Linux/Unix系统的日志系统
- 网站的访问计数器
- 服务端程序的连接池、线程池、数据池。
- 获取单一对象的方法:
- 定义全局(C语言),但不受控制,防君子不能防小人
- 专门写一个类,让类的构造函数设置私有,借助静态成员函数提供一个接口,以此来获取唯一的实例
- C++如何实现单例:
- 禁止类的外部创建类对象:构造函数设置私有化
- 类自己维护一个唯一的对象:使用一个静态指针指向
- 提供一个获取该实例的方法:静态成员函数获取静态指针
饿汉模式和懒汉模式
饿汉模式:
将单例类的唯一实例对象定义为成员变量,当程序开始运行,实例对象就已经创建完成
- 优点:加载进行时静态创建单例对象,线程安全
- 缺点:无论使用与否,总要创建,浪费内存
#include <iostream>
using namespace std;
class Singleton
{
private:
Singleton(void)
{
}
static Singleton object;
public:
static Singleton& get_object(void)
{
return object;
}
void show(void)
{
cout << "我是对象:" << &object << endl;
}
};
Singleton Singleton::object;
int main()
{
Singleton sig = Singleton::get_object();
sig.show();
Singleton sig1 = Singleton::get_object();
sig1.show();
}
懒汉模式:
用静态成员指针来指向单例类的唯一实例对象,只有真正调用获取实例对象的静态接口时,实例对象才会被创建
- 优点:什么时候用就什么时候创建,节约内存
- 缺点:在第一次调用访问获取实例对象的静态接口才真正创建,如果多线程操作情况下有可能被创建出多个实例对象,存在线程不安全。
#include <iostream>
#include <pthread.h>
using namespace std;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
class Singleton
{
private:
Singleton(void) { }
static Singleton* objectp;
public:
static Singleton& get_object(void)
{
if(NULL == objectp)
{
pthread_mutex_lock(&mutex);
objectp = new Singleton;
pthread_mutex_unlock(&mutes);
}
return *objectp;
}
void show(void)
{
cout << "我是对象:" << objectp << endl;
}
};
Singleton* Singleton:: objectp;
int main()
{
Singleton str = Singleton::get_object();
str.show();
Singleton str1 = Singleton::get_object();
str1.show();
}