单例模式是一种创建型的设计模式,主要用于在当前项目中需要实例化一个对象的情况。
适用场景:
1、如果程序中对于某一个类型对于整个项目只有一个可用实例。
2、用于存储全局变量
实现过程:
1、创建一个需要实例化的类
2、将创建的类的构造函数设置为私有类型
3、在这个类中定义一个静态成员函数,在这个函数new一个类对象并返回
通过以上三步单例模式基本上就实现了,但是在第三步中如果单纯使用new来创建类对象,这里需要注意线程安全,这里最安全的做法就是使用一个静态成员函数,返回静态成员函数的地址,这样能保证线程安全。
cpp
#include <iostream>
#include "DanLiMoShi.h"
int main()
{
std::cout << "欢迎东哥来到设计模式的世界!\n";
DanLiMoShi* dMode = DanLiMoShi::interface();
dMode->setName("东哥");
dMode->setAge(27);
DanLiMoShi* dMode1 = DanLiMoShi::interface();
cout << "姓名:" << dMode1->getName() << " 年龄:" << dMode->getAge();
}
cpp
#pragma once
#include <string>
using namespace std;
class DanLiMoShi
{
public:
static DanLiMoShi * interface();
void setName(string name);
string getName();
void setAge(int age);
int getAge();
private:
DanLiMoShi();
~DanLiMoShi();
static DanLiMoShi m_dMode;
static DanLiMoShi* m_dMode1;
string m_name;
int m_age;
};
cpp
#include "DanLiMoShi.h"
DanLiMoShi DanLiMoShi::m_dMode;
DanLiMoShi* DanLiMoShi::m_dMode1 = nullptr;
DanLiMoShi* DanLiMoShi::interface() {
//方式1
//return &m_dMode;
//方式2 懒汉式单例模式
if (m_dMode1 == nullptr) {
m_dMode1 = new DanLiMoShi();
}
return m_dMode1;
}
void DanLiMoShi::setName(string name)
{
m_name = name;
}
string DanLiMoShi::getName()
{
return m_name;
}
void DanLiMoShi::setAge(int age)
{
m_age = age;
}
int DanLiMoShi::getAge()
{
return m_age;
}
DanLiMoShi::DanLiMoShi()
{
}
DanLiMoShi::~DanLiMoShi()
{
}
那么以上两种方式那种好,这里当然是第一种好,具体可以看C++对static的解释。