Openssl数据安全传输平台012:单例类饿汉模式-Log日志模块的设计

本文介绍了如何在C++项目中使用单例模式实现日志模块,重点讨论了懒汉式和饿汉式的区别,以及它们在Logger类中的应用,包括头文件和cpp实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 代码仓库

https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform/tree/main/Preparation/06.C%20Sosket%20API%E5%B0%81%E8%A3%85%E6%88%90C%2B%2B%E7%B1%BB/2.%E5%B0%81%E8%A3%85%E6%88%90C%2B%2B%E7%B1%BB/connectPool/connectPool

1 单例模式是什么?

单例模式是一种创建型的软件设计模式,在工程项目中非常常见。通过单例模式的设计,使得创建的类在当前进程中只有一个实例,并提供一个全局性的访问点,这样可以规避因频繁创建对象而导致的内存飙升情况。

  • 实现单例模式的三个要点:
    (1)私有化构造函数:这样外界就无法自由地创建类对象,进而阻止了多个实例的产生。
    (2)类定义中含有该类的唯一静态私有对象:静态变量存放在全局存储区,且是唯一的,供所有对象使用。
    (3)用公有的静态函数来获取该实例:提供了访问接口。

  • 单例模式一般分为懒汉式饿汉式
    (1)懒汉式:在使用类对象(单例实例)时才会去创建它,不然就懒得去搞。
    (2)饿汉式:单例实例在类装载时构建,有可能全局都没使用过,但它占用了空间,就像等着发救济粮的饿汉提前排好队等吃的一样。

2 日志模块

  • 采取了饿汉单例模式:
    -将构造函数声明为私有;
    -并将Logger的一个类实例作为全局的成员变量保存,提供一个static方法获取该实例。

2.1 日志模块的头文件

#pragma once
#include <string>
#include <fstream>
// 饿汉模式单例类
class Logger
{
public:
	enum Type { CONSOLE, FILE };
	enum Level { DEBUG, INFO, WARNING, ERROR, CRITICAL };
	static Logger* getInstance();
	void Log(std::string text, std::string file, int line, Level level = INFO);
	void setEnableLevel(Level level);
	inline void setDevice(Type device)
	{
		m_device = device;
	}
	~Logger();
private:
	Logger();
	Logger(const Logger& log);

private:
	std::ofstream m_writer;
	static Logger m_log;
	Level m_level = INFO;
	Type m_device = CONSOLE;
};

2.2 日志模块的实现cpp

#include "Logger.h"
#include <iostream>

Logger Logger::m_log;

Logger::Logger()
{
	m_writer.open("logger.log");
}

Logger * Logger::getInstance()
{
	return &m_log;
}

void Logger::Log(std::string text, std::string file, int line, Level level)
{
	bool flag = level >= m_level;
	if (flag)
	{
		if (m_device == CONSOLE)
		{
			// 日志信息控制台输出
			std::cout << "File[ " << file << " ], Line[ " << line
				<< " ], Infomation[ " << text << " ]" << std::endl;
		}
		else
		{
			// 日志信息写文件
			m_writer << "File[ " << file << " ], Line[ " << line
				<< " ], Infomation[ " << text << " ]" << std::endl;
			// 数据强制刷到磁盘
			m_writer.flush();
		}

	}
}

void Logger::setEnableLevel(Level level)
{
	m_level = level;
}

Logger::~Logger()
{
	m_writer.close();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值