【单例模式】以C++实现Json串读写

1. 什么是单例模式

  • 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。
  • 在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。
  • 单例模式在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性。

2. 单例模式的作用:线程安全

  • 给共享的资源加把锁,保证每个资源变量每时每刻至多被一个线程占用。
  • 或者让线程也拥有资源,不用去共享进程中的资源。

3. 单例模式分类

1. 懒汉式

系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。这种方式要考虑线程安全。
2. 饿汉式
系统一运行,就初始化创建实例,当需要时,直接调用即可。这种方式本身就线程安全,没有多线程的线程安全问题。

4. 单例类的特点

  1. 构造函数和析构函数为私有类型,目的是禁止外部构造和析构。
  2. 拷贝构造函数和赋值构造函数是私有类型,目的是禁止外部拷贝和赋值,确保实例的唯一性。
  3. 类中有一个获取实例的静态方法,可以全局访问。用户通过接口获取实例:使用 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值