C++实现单例模式实例详解
什么是单例模式
单例模式是一种创建型设计模式,这种模式的主要特点是只能创建一个实例对象,该实例对象可以在系统内部被任何方法访问和共享。单例模式在许多场景下都有着广泛的应用,比如Spring中的Bean管理、数据库连接池等等。
单例模式的实现方法
在C++中,实现单例模式主要有两种方式:懒汉式和饿汉式。其中懒汉式是在第一次使用时创建实例,而饿汉式是在程序启动时就创建实例。下面分别对这两种方式进行详细的讲解。
懒汉式
懒汉式缺点是线程不安全,需要加锁保证线程安全。
class Singleton{
public:
static Singleton* getInstance();
~Singleton();
private:
Singleton();
static Singleton* instance;
static mutex mtx;
};
Singleton* Singleton::instance = NULL;
mutex Singleton::mtx;
Singleton::Singleton(){}
Singleton* Singleton::getInstance()
{
if(instance == NULL){
lock_guard<mutex> lk(mtx);
if(instance == NULL){
instance = new Singleton();
}
}
return instance;
}
Singleton::~Singleton()
{
delete instance;
}
饿汉式
饿汉式实现简单,但无法延迟实例的创建,有一定的资源浪费风险。
class Singleton{
public:
static Singleton* getInstance();
~Singleton();
private:
Singleton(){}
static Singleton* instance;
};
Singleton* Singleton::instance = new Singleton();
Singleton* Singleton::getInstance()
{
return instance;
}
Singleton::~Singleton()
{
delete instance;
}
单例模式的示例说明
示例一
以懒汉式单例模式为例,假设现在要实现一个日志系统,该系统需要保证只能被初始化一次并可以全局访问。下面是实现代码:
// Logger.h
class Logger{
public:
static Logger* getLogger();
void log(string msg);
~Logger();
private:
Logger();
static Logger* instance;
static mutex mtx;
};
// Logger.cpp
Logger* Logger::instance = NULL;
mutex Logger::mtx;
Logger::Logger(){}
Logger* Logger::getLogger()
{
if(instance == NULL){
lock_guard<mutex> lk(mtx);
if(instance == NULL){
instance = new Logger();
}
}
return instance;
}
void Logger::log(string msg)
{
cout << "Log: " << msg << endl;
}
Logger::~Logger()
{
delete instance;
}
示例二
再以饿汉式单例模式为例,假设现在要实现一个配置管理系统,该系统需要在程序启动时就加载配置,并且保证只加载一次。下面是实现代码:
// Config.h
class Config{
public:
static Config* getConfig();
void setConfig(string key, string value);
string getConfig(string key);
~Config();
private:
Config();
static Config* instance;
map<string, string> configMap;
};
// Config.cpp
Config* Config::instance = new Config();
Config::Config(){}
Config* Config::getConfig()
{
return instance;
}
void Config::setConfig(string key, string value)
{
configMap[key] = value;
}
string Config::getConfig(string key)
{
return configMap[key];
}
Config::~Config()
{
delete instance;
}
总结
单例模式是一种非常实用的设计模式,可以用来保证全局只有一个实例对象,并且可以在系统的任意位置访问该对象。本文分别介绍了懒汉式和饿汉式两种单例模式的实现方法,并且给出了两个示例说明。在实际开发中,我们可以根据具体场景选择合适的方式来实现单例模式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现 单例模式实例详解 - Python技术站