[设计模式]单例模式_饿汉_懒汉模式代码片段

@ 单例模式 懒汉式
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。
也就是说,在整个程序空间中,该类只存在一个实例对象
a) 构造函数私有化
b) 提供一个全局的静态方法(全局访问点)
c) 在类中定义一个静态指针,指向本类的变量的静态变量指针
d)禁用拷贝构造函数
为了管理好单例实例对象 使用智能指针来管理 当对象引用计数为0时智能指针自动帮我们释放
@ 单例模式 懒汉式 遇到多线程 需要加锁
饿汉式 就是不管你用不用 我都帮你 创建对象实例 也无需考虑多线程安全的问题
直接看代码

懒汉式

#pragma once
#include <iostream>
#include <memory>
#include <mutex>
#include <string>
#include <windows.h>
std::mutex g_mutex;
/*
@ 单例模式 懒汉式
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。
也就是说,在整个程序空间中,该类只存在一个实例对象
a) 构造函数私有化
b) 提供一个全局的静态方法(全局访问点)
c) 在类中定义一个静态指针,指向本类的变量的静态变量指针
d)禁用拷贝构造函数
为了管理好单例实例对象 使用智能指针来管理 当对象引用计数为0时智能指针自动帮我们释放
@ 单例模式 懒汉式 遇到多线程 需要加锁
*/
class singleton 
{
public:
	~singleton() {
		if (!m_SingletonPtr.use_count())
		{
			m_SingletonPtr.reset();
		}
		std::cout << "~singleton 析构函数 智能指针引用计数 = "  << m_SingletonPtr.use_count() << std::endl;
	}
	singleton(const singleton & oter) = delete;
	singleton operator=(const singleton& oter) = delete;
public:
	void output(const std::string& value) {
		Sleep(1000);
		std::cout << "智能指针引用计数 = " << m_SingletonPtr.use_count() << std::endl;
		std::cout << value << std::endl;
	}
	static singleton* GetInstance() {
		/*通过这个函数获取实例对象*/
		if (m_SingletonPtr == nullptr)
		{
			std::lock_guard<std::mutex> lock_mutex(g_mutex); // 加锁 防止多线程 重复创建
			if (m_SingletonPtr.get() == nullptr)
			{
				m_SingletonPtr.reset(new singleton());
			}
		}
		return m_SingletonPtr.get();
	}
private:
	singleton() {
		std::cout << "singleton 构造函数" << std::endl;
	}
private:
	static std::shared_ptr<singleton> m_SingletonPtr;
};
//初始化静态成员变量
std::shared_ptr<singleton> singleton::m_SingletonPtr = nullptr;

饿汉式

#pragma once
#include <iostream>
#include <memory>
#include <mutex>
#include <string>
#include <windows.h>
/*
@ 单例模式 饿汉式
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。
也就是说,在整个程序空间中,该类只存在一个实例对象
a) 构造函数私有化
b) 提供一个全局的静态方法(全局访问点)
c) 在类中定义一个静态指针,指向本类的变量的静态变量指针
d)禁用拷贝构造函数
饿汉式 就是不管你用不用 我都帮你 创建对象实例 也无需考虑多线程安全的问题
*/
class singleton 
{
public:
	~singleton() {
		if (!m_SingletonPtr.use_count())
		{
			m_SingletonPtr.reset();
		}
		std::cout << "~singleton 析构函数 智能指针引用计数 = "  << m_SingletonPtr.use_count() << std::endl;
	}
	singleton(const singleton & oter) = delete;
	singleton operator=(const singleton& oter) = delete;
public:
	void output(const std::string& value) {
		Sleep(1000);
		std::cout << "智能指针引用计数 = " << m_SingletonPtr.use_count() << std::endl;
		std::cout << value << std::endl;
	}
	static singleton* GetInstance() {
		/*通过这个函数获取实例对象*/
		return m_SingletonPtr.get();
	}
private:
	singleton() {
		std::cout << "singleton 构造函数" << std::endl;
	}
private:
	static std::shared_ptr<singleton> m_SingletonPtr;
};
std::shared_ptr<singleton> singleton::m_SingletonPtr = std::shared_ptr<singleton>(new singleton);

下面是执行代码

执行代码

// 设计模式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <thread>
//#include "单例模式.hpp"
#include "单例模式_饿汉.hpp"
int main()
{
	for (auto i = 0; i < 10;++i)
	{
		std::thread t([&]() {
			singleton::GetInstance()->output("thread index: " + std::to_string(i));
		});
		t.join();
	}
    std::cout << "Hello World!\n";
}
posted @ 2020-05-09 13:56  轻风々  阅读(266)  评论(0编辑  收藏  举报