设计模式-单例模式
2023-09-11 14:14:01 时间
单例模式(Singleton):
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式分为懒汉模式和饿汉模式,以及在创建实例的时候要考虑多线程问题,也就是需要上锁,上锁可以采用一般的锁,也可以采用双重锁的方式减少上锁时内核态与用户态切换导致的资源浪费,同时因为饿汉模式的特性,饿汉模式不涉及到多线程上锁问题。
接下来实现一下懒汉模式和饿汉模式,先不考虑多线程问题,最后在单独说下多线程问题的处理代码。
单例模式(懒汉)
.h
#pragma once
#include <iostream>
using namespace std;
class CWork
{
private:
static CWork * m_cWork;
static int m_nMarkRunCount;
CWork(){} //By using the constructor as a private block to prevent users from using the class variable.
void DoWrite()
{
cout<<"WorkCount:"<<m_nMarkRunCount++<<endl;
}
public:
static void GetInstance()
{//Create a static function of the entity
if(m_cWork == NULL)
{
m_cWork = new CWork();
}
}
static void WriteLog()
{//work function
if(m_cWork == NULL)
{
cout<<"no instance"<<endl;
return ;
}
m_cWork->DoWrite();
}
};
.cpp
#include "stdafx.h"
#include "SingletonMode.h"
CWork * CWork::m_cWork = NULL;
int CWork::m_nMarkRunCount = 0;
客户端调用:
#include "stdafx.h"
#include "SingletonMode.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
CWork::WriteLog();
CWork::GetInstance();
CWork::WriteLog();
CWork::WriteLog();
return 0;
}
运行结果:单例模式(饿汉)
.h
#pragma once
#include <iostream>
using namespace std;
class CWork
{
private:
static CWork * m_cWork;
static int m_nMarkRunCount;
CWork(){} //By using the constructor as a private block to prevent users from using the class variable.
void DoWrite()
{
cout<<"WorkCount:"<<m_nMarkRunCount++<<endl;
}
public:
static CWork* GetInstance()
{//Create a static function of the entity
if(m_cWork == NULL)
{
m_cWork = new CWork();
}
return m_cWork;
}
static void WriteLog()
{//work function
if(m_cWork == NULL)
{
cout<<"no instance"<<endl;
return ;
}
m_cWork->DoWrite();
}
};
.cpp
#include "stdafx.h"
#include "SingletonMode.h"
CWork * CWork::m_cWork = CWork::GetInstance();
int CWork::m_nMarkRunCount = 0;
客户端调用:
#include "stdafx.h"
#include "SingletonMode.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
CWork::WriteLog();
CWork::WriteLog();
CWork::WriteLog();
return 0;
}
运行结果:
Static void GetInstance()
{
If(m_cWork == NULL)
{
Lock
{
If(m_cWork == NULL)
{
m_cWork = new CWork();
}
}
}
}//注意第二个if的作用。
相关文章
- 设计模式的C语言应用-命令模式-第五章
- 【设计模式】访问者模式
- 《从零开始学Swift》学习笔记(Day67)——Cocoa Touch设计模式及应用之MVC模式
- 【设计模式】单例模式
- 【java设计模式】之 单例(Singleton)模式
- 单例模式及常见写法分析(设计模式01)
- 【项目实战】设计模式之单例模式
- Java的二十三种设计模式(适配器模式(Adapter)、对象的适配器模式)
- C++设计模式解析之单例模式解析
- 设计模式-单例模式
- C++设计模式之状态模式
- C++设计模式——迭代器模式(Iterator)
- JAVA设计模式之单例模式
- 设计模式学习总结(三)——单例模式
- 设计模式之中介者模式
- 设计模式---享元模式
- 【阅读笔记】JavaScript设计模式与开发实践2--闭包与单例、策略模式
- 聊聊设计模式之单例模式
- 设计模式-策略模式
- 【设计模式】解释器模式(C#)
- 23种设计模式-3工厂模式-抽象工厂