【单例模式】以C++实现Json串读写
1. 什么是单例模式
- 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。
- 在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。
- 单例模式在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性。
2. 单例模式的作用:线程安全
- 给共享的资源加把锁,保证每个资源变量每时每刻至多被一个线程占用。
- 或者让线程也拥有资源,不用去共享进程中的资源。
3. 单例模式分类
1. 懒汉式
系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。这种方式要考虑线程安全。
2. 饿汉式
系统一运行,就初始化创建实例,当需要时,直接调用即可。这种方式本身就线程安全,没有多线程的线程安全问题。
4. 单例类的特点
- 构造函数和析构函数为私有类型,目的是禁止外部构造和析构。
- 拷贝构造函数和赋值构造函数是私有类型,目的是禁止外部拷贝和赋值,确保实例的唯一性。
- 类中有一个获取实例的静态方法,可以全局访问。用户通过接口获取实例:使用 static 类成员函数。
5. 我使用的局部变量懒汉单例式
class JsonConfig
{
public:
static JsonConfig &instance();
private:
JsonConfig(){
};
~JsonConfig(){
};
JsonConfig(const JsonConfig &signal);
const JsonConfig &operator=(const JsonConfig &signal);
}
JsonConfig & JsonConfig::instance()
{
/**
* 局部静态特性的方式实现单实例。
* 静态局部变量只在当前函数内有效,其他函数无法访问。
* 静态局部变量只在第一次被调用的时候初始化,也存储在静态存储区,生命周期从第一次被初始化起至程序结束止。
*/
static JsonConfig m_instance;
return m_instance;
}
6. C++实现
config.h
#ifndef CONFIG_H
#define CONFIG_H
#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
class JsonConfig
{
public:
static JsonConfig &instance();
template <typename T>
T get(const std::string &name)
{
try
{
loadPt();
return m_pt.get<T>(name);
}
catch (boost::property_tree::ptree_bad_path const &e)
{
std::cout << e.what() << std::endl;
throw;
}
catch (std::exception const &e)
{
std::cout << "unexpected error, " << e.what() << std::endl;
throw;
}
};
template <typename T>
std::vector<T> getVector(const std::string &name)
{
try
{
std::vector<T> value{
};
loadPt();
for (const auto &itr : m_pt.get_child(name))
{
value.emplace_back(itr.second.get_value