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

文章目录

  • 0 代码仓库
  • 1 单例模式是什么?
  • 2 日志模块
    • 2.1 日志模块的头文件
    • 2.2 日志模块的实现cpp

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 
#include 
// 饿汉模式单例类
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 

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();
}

你可能感兴趣的:(数据安全传输基础设置平台项目,设计模式,开发语言,c++,设计模式)