Hello大家好,好久没更新了,今天给大家补上最基础的设计模式:单例模式。这个单例模式实在是我的心结啊,2021年末左右面试京东算法岗,面试官让我写一个单例,没写出来,至今遗憾,不过进不去京东也挺好,前一阵不还裁员呢吗哈哈哈哈,要记住一切都是最好的安排。本篇简单介绍单例模式,并给出单例模式日志实现。
目录
一、单例模式简单介绍
1.1 基础介绍
1.2 单例模式使用场景
二、单例模式实现日志记录(Singleton Logger)
三、总结
单例模式只保证一个程序内只有一个实例存在,并提供全局访问点来访问该实例,其实就是单例模式的类对象只允许存在一个,它和多线程思想恰恰相反,为的是保证操作资源的安全。比如日志系统需要记载时间的,如果多线程会搞得很乱。
实现单例模式的关键是构造函数需要被设为私有,以防止外部代码创建多个实例。同时,需要提供一个静态方法来获取实例,这个方法会检查是否已经有一个实例存在,如果存在就返回这个实例,否则就创建一个新的实例并返回。
下面是一个简单的 C++ 单例模式示例代码:
class Singleton {
public:static Singleton* GetInstance() {if (instance_ == nullptr) {instance_ = new Singleton();}return instance_;}void DoSomething() {// ...}private:Singleton() {// ...}static Singleton* instance_;
};Singleton* Singleton::instance_ = nullptr;
#include
#include
#include
#include using namespace std;class Logger {
private:static Logger* instance;ofstream logFile;Logger() {string filename = "log.txt";logFile.open(filename.c_str(), ios::out | ios::app);}public:static Logger* getInstance() {if (instance == NULL) {instance = new Logger();}return instance;}void log(string message) {time_t now = time(0);char* dt = ctime(&now);logFile << dt << ": " << message << endl;}
};Logger* Logger::instance = NULL;int main() {Logger* logger = Logger::getInstance();logger->log("Hello World!");return 0;
}
在上述代码中,Logger类具有私有的构造函数和一个私有的静态成员变量instance。getInstance()函数是一个公有的静态成员函数,它返回Logger类的唯一实例。如果实例不存在,则创建一个新的实例。log()函数用于向日志文件写入消息。
在main函数中,我们首先获取Logger实例,然后调用log()函数记录日志。由于Logger类是单例模式,因此在程序运行期间只会有一个Logger实例存在,因此多次调用log()函数将在同一个文件中记录日志。
请注意,由于单例模式在多线程环境下可能存在问题,因此需要进行线程安全的处理。在本例中,我们忽略了线程安全问题,仅提供了单线程环境下的实现。
单例模式很辛苦,很孤单,请善待单例模式。
可爱的、亲爱的你周末愉快。