设计模式——单例模式
(1)目的:保证一个类只有一个实例,并提供一个访问它的全局访问点。
(2)如何实现:
将构造函数声明为private的,定义一个一个public的GetInstance的方法,返回这个类的实例。
1.饿汉式单例:将类中的单例声明为static,在自己被加载时就将自己实例化。
2.懒汉式单例:将保存类的实例的指针初始化为空,在GetInstance中判断类的实例是否为空,为空的话实例化类的实例,不为空的话返回类的实例。
(3)tag:
1.注意懒汉式中的为了避免多个 线程同时访问GetInstance时实例化多个对象的问题,注意加锁。
│ home.cpp
│ home.h
│ home1.cpp
│ home1.h
│ Singleton.cpp
│ home.h(懒汉)
#pragma once
#include <mutex>
class Home
{
private:
Home();
static std::mutex* m;
int i = 0;
public:
static Home* ptr;
static Home* GetHomeInstance();
void SetI();
};
│ home1.h(饿汉)
#pragma once
class Home1
{
private:
const Home1();
int i = 0;
public:
static Home1* ptr;
static void SetPtr();
Home1* GetHome1();
void SetI();
};
│ home.cpp
#include<iostream>
#include "home.h"
Home* Home::ptr=nullptr;
std::mutex* Home::m=new std::mutex();
Home::Home()
{
std::cout << "欢迎来到酱酱家!" << std::endl;
}
Home* Home::GetHomeInstance()
{
if (ptr == nullptr)
{
m->lock();
if (ptr == nullptr)
{
ptr = new Home();
}
m->unlock();
}
return ptr;
}
void Home::SetI()
{
++i;
std::cout << i << std::endl;
}
│ home1.cpp
#include<iostream>
#include "home1.h"
Home1* Home1::ptr= new Home1();
Home1::Home1()
{
std::cout << "欢迎来到大大的家!" << std::endl;
}
Home1* Home1::GetHome1()
{
return ptr;
}
void Home1::SetI()
{
++i;
std::cout << i << std::endl;
}
│ Singleton.cpp
#include <iostream>
#include"home.h"
#include"home1.h"
int main()
{
Home* p = p->GetHomeInstance();
p->GetHomeInstance();
p->SetI();
Home* p2 = p->GetHomeInstance();
p2->SetI();
}