单例模式:
单例模式是一种常用的软件设计模式。在它的核心结构中只包含—个被称为单例的特殊类。
通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。 如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
- 该类不能被复制。
- 该类不能被公开的创造。
实现单例模式的步骤:
1.构造函数私有化
2.增加静态私有的当前类的指针
3.提供静态对外接口,可以让用户获得单例对象
该私有的构造函数的构造时机上来说也可以分两种情况来构造:
- 只有当需要改类的时候去构造(即为懒汉模式)
- 在程序开始之前我就先构造好,你到时候直接用就行(即为饿汉模式)
懒汉式碰到多线程,是线程不安全
饿汉式是线程安全的,多线程用饿汉式
示例:
#include <iostream>
using namespace std;
//单例 分为饿汉式/懒汉式
// 懒汉式碰到多线程,是线程不安全
// 饿汉式是线程安全的,多线程用饿汉式
//懒汉式
class Singleton_Lazy {
private:
Singleton_Lazy(){}
public:
static Singleton_Lazy* getInstance(){
if (NULL == pSingleton) {
pSingleton = new Singleton_Lazy;
}
return pSingleton;
}
private:
static Singleton_Lazy* pSingleton;
};
Singleton_Lazy* Singleton_Lazy:: pSingleton = NULL;
//饿汉式
class Singleton_Hungry {
private:
Singleton_Hungry() {}
public:
static Singleton_Hungry* getInstance() {
return pSingleton;
}
private:
static Singleton_Hungry* pSingleton;
};
Singleton_Hungry* Singleton_Hungry::pSingleton = new Singleton_Hungry;
void test()
{
Singleton_Lazy* p1 = Singleton_Lazy::getInstance();
Singleton_Lazy* p2 = Singleton_Lazy::getInstance();
if (p1 == p2)
{
cout << "两个指针指向同一块内存空间,是单例" << endl;
}
else {
cout << "不是单例模式" << endl;
}
Singleton_Hungry* p3 = Singleton_Hungry::getInstance();
Singleton_Hungry* p4 = Singleton_Hungry::getInstance();
if (p3 == p4)
{
cout << "两个指针指向同一块内存空间,是单例" << endl;
}
else {
cout << "不是单例模式" << endl;
}
}
int main()
{
test();
return 0;
}