设计模式通常可以分为三类:创建型模式、行为型模式、结构型模式
创建型模式
单例模式
应用场景:
在多线程之间共享一个对象;
在程序空间上分配全局变量;
考虑性能,需考虑对象的创建事件;
实现方式:
- 构造函数私有化
- 提供一个全局的静态方法
- 在类中定义一个静态指针,指向类的变量的静态变量指针
根据初始化方式可分为懒汉式和饿汉式单例模式
懒汉式代码实现:
#include<iostream>
using namespace std;
class Singleton
{
private:
Singleton()
{
cout << "执行构造函数" << endl;
}
public:
static Singleton* GetInstance()
{
if (mSingleton == nullptr)
{
mSingleton = new Singleton;
}
return mSingleton;
}
static void FreeInstance()
{
if (mSingleton != nullptr)
{
delete mSingleton;
mSingleton = nullptr;
}
}
private:
static Singleton* mSingleton;
};
Singleton* Singleton::mSingleton = nullptr;
int main()
{
Singleton *m1 = Singleton::GetInstance();
Singleton *m2 = Singleton::GetInstance();
m1->FreeInstance();
m2->FreeInstance();
return system("pause");
}
饿汉模式代码实现:
#include<iostream>
using namespace std;
class Singleton
{
private:
Singleton()
{
cout << "执行构造函数" << endl;
}
public:
static Singleton* GetInstance()
{
return msSingleton;
}
static void FreeSingleton()
{
if (msSingleton != nullptr)
{
delete msSingleton;
msSingleton = nullptr;
}
}
private:
static Singleton* msSingleton;
};
Singleton* Singleton::msSingleton = new Singleton;
int main()
{
Singleton *m1 = Singleton::GetInstance();
Singleton *m2 = Singleton::GetInstance();
m1->FreeSingleton();
m2->FreeSingleton();
return system("pause");
}
多线程下懒汉式安全实现:
#include<iostream>
#include<Windows.h>
#include<process.h>
using namespace std;
CRITICAL_SECTION gSection;
class Singleton
{
private:
Singleton()
{
cout << "执行构造函数" << endl;
Sleep(20);
cout << "执行构造函数" << endl;
}
public:
static Singleton* GetInstance()
{
if (mSingleton == nullptr)
{
EnterCriticalSection(&gSection);
if (mSingleton == nullptr)
{
mSingleton = new Singleton;
++Singleton::nCount;
cout << "Singleton::nCount" << Singleton::nCount << endl;
}
LeaveCriticalSection(&gSection);
}
return mSingleton;
}
static void FreeInstance()
{
if (mSingleton != nullptr)
{
if (mSingleton != nullptr)
{
delete mSingleton;
mSingleton = nullptr;
}
}
}
private:
static Singleton* mSingleton;
static int nCount;
};
int Singleton::nCount = 0;
Singleton* Singleton::mSingleton = nullptr;
unsigned __stdcall StartAddress(int* i)
{
Singleton *m1 = Singleton::GetInstance();
Singleton *m2 = Singleton::GetInstance();
cout << "我是线程" << *i << endl;
return 0;
}
HANDLE hThread[200]{};
int main()
{
InitializeCriticalSection(&gSection);
for (int i = 0; i < 200; i++)
{
hThread[i] = (HANDLE)_beginthreadex(nullptr, 0, (_beginthreadex_proc_type)StartAddress, (void*)(&i), false, nullptr);
}
for (int i = 0; i < 200; ++i)
{
WaitForSingleObject(hThread[i], INFINITE);
}
for (int i = 0; i < 200; ++i)
{
CloseHandle(hThread[i]);
}
cout << "子线程运行结束" << endl;
Singleton *m1 = Singleton::GetInstance();
Singleton *m2 = Singleton::GetInstance();
m1->FreeInstance();
m2->FreeInstance();
DeleteCriticalSection(&gSection);
return system("pause");
}