引言
工作中经常会用到单例,单例的写法都是比较固定的,所有还是归纳总结下来,已便于以后复用。
有话要说
文章内容可能会在我工作过程中更新,欢迎大家指出代码问题和提出优化建议(抱拳)。
本来想写一个单例模板或者单例基类什么的,但一直没想到如何编码,求解答!
代码实现
单例类Singleton使用标准C++ 语法,具有线程安全和自动回收的特点,满足了我工作的大部分场景。
Singleton.h
#pragma once
//前置声明 可以避免外部include多余的头文件
namespace std
{
class mutex;
}
class Singleton
{
public:
//************************************
// Method: getInstance
// Access: public static
// Returns: Singleton *
// Description: 获取实例
//************************************
static Singleton * getInstance();
public:
//定义方法
private:
//************************************
// Method: Singleton
// Access: private
// Returns:
// Description: private:外部不能调用构造函数创建对象
//************************************
Singleton();
//************************************
// Method: ~Singleton
// Access: private
// Returns:
// Description: private:外部不能外部调用析构释放对象
// virtual:避免释放基类指针时,无法调用到子类析构函数 外部不能外部调用析构释放对象
//************************************
virtual ~Singleton();
private:
//指针实例,使用懒加载
static Singleton * instance_;
//实例的互斥锁,确保多线程安全
static std::mutex * instance_mutex_;
private:
//定义成员
private:
//内部类及静态成员,自动回收内存
class Recycler
{
public:
~Recycler();
};
//自动释放资源,并通过析构函数回收其他资源
static Recycler recycler_;
};
Singleton.cpp
#include "Singleton.h"
#include <mutex>
Singleton * Singleton::instance_ = nullptr;
std::mutex * Singleton::instance_mutex_ = new std::mutex();
Singleton * Singleton::getInstance()
{
//双重检验锁 多线程安全
if (instance_ == nullptr)
{
instance_mutex_->lock();
if (instance_ == nullptr)
{
instance_ = new Singleton;
}
instance_mutex_->unlock();
}
return instance_;
}
Singleton::Singleton()
{
}
Singleton::~Singleton()
{
}
Singleton::Recycler::~Recycler()
{
//回收instance_
if (instance_ != nullptr)
{
delete instance_;
instance_ = nullptr;
}
//回收instance_mutex_
if (instance_mutex_ != nullptr)
{
delete instance_mutex_;
instance_mutex_ = nullptr;
}
}
更简单的实现方式 (C++11推荐)
局部静态变量就是定义在函数内部的静态变量。 它的初始化发生在该函数第一次被调用执行到局部静态变量定义语句时 。 但在C++98/03标准中,这一代码并不是线程安全的。 C++11 要求保证函数内部静态变量线程安全,所有C++11更推荐这个实现方式。
Singleton.h
#pragma once
class Singleton
{
public:
//************************************
// Method: getInstance
// Access: public static
// Returns: Singleton *
// Description: 获取实例
//************************************
static Singleton * getInstance();
public:
//定义方法
private:
//************************************
// Method: Singleton
// Access: private
// Returns:
// Description: private:外部不能调用构造函数创建对象
//************************************
Singleton();
//************************************
// Method: ~Singleton
// Access: private
// Returns:
// Description: private:外部不能外部调用析构释放对象
// virtual:避免释放基类指针时,无法调用到子类析构函数 外部不能外部调用析构释放对象
//************************************
virtual ~Singleton();
private:
//定义成员
};
Singleton.cpp
#include "Singleton.h"
Singleton * Singleton::getInstance()
{
static Singleton instance_;
return &instance_;
}
Singleton::Singleton()
{
}
Singleton::~Singleton()
{
}