单例模式

发布时间 2023-09-22 18:31:29作者: 游客0721

工作场景:配置文件

 比如redis的配置文件redis.conf里面包涵连接数据库需要的连接信息、用户名、用户密码等配置信息,每个用户都有这个可修改的配置文件进行数据库连接个性化配置(这份文件不能写死但大体内容类似),所以需要使用设计模式思想进行代码复用,这里采将会用设计模式里的单例模式

数据库配置文件复用写法(简化版)
#include <iostream>
//给用户一个config.txt文件,由用户自己修改文件需要个性化的值,只需要在当前代码中调入完成数据库的初始化配置
class SqlQuery
{
public:
    //在构造类的时候传入连接信息,用户名,密码
    SqlQuery(const std::string& conn, const std::string& username, const std::string& password)
    {
        m_conn = conn;
        m_username = username;
        m_password = password;
    }
    //一个查询数据库操作的成员函数
    int query()
    {
        // 假装这里有实现。
        return 0;
    }

    std::string m_conn;
    std::string m_username;
    std::string m_password;
};
//打开文件流的必要头文件
#include <fstream>
#include <iostream>

int main()
{
    for (int i = 0; i < 100; i++) {
        //数据库信息默认值
        std::string conn = "mysql://localhost:3306/db/";
        std::string username = "user";
        std::string password = "password";
        //一行一行的读取给用户个性化配置的文件的内容
        std::fstream fs("D://Config/config.txt");
        //读取数据的缓冲区
        char tempStr[1024];
        //当前读取数据的行数
        int index = 0;
        while (fs.getline(tempStr, 1024)) {
            if (index == 0) {
                conn = tempStr;
            }
            else if (index == 1) {
                username = tempStr;
            }
            else if (index == 2) {
                password = tempStr;
            }
            //循环读取每次加一行,直到读完
            index++;
        }
        //打印数据
        printf("conn: %s\n", conn.c_str());
        printf("username: %s\n", username.c_str());
        printf("password: %s\n", password.c_str());
        //构建对象传入参数
        SqlQuery query(conn, username, password);

        // 查询操作
        query.query();
    }


    std::cout << "C3_1\n";
}

上述传统文件配置是一种可行的方案,但存在缺点:同一用户每次连接相同的数据库的时候都需要从文件(磁盘中)中读取个性化的数据库配置文件,其实只需要保存一次或者从内存读取,否则数据库连接效率会大大降低