单例使用以及MVC框架初识

单例模式适用范围

 在一个应用程序中,一个类有且只有一个实例,并提供一个访问它的 全局访问点。

在程序设计过程中,有很多情况需要确保一个类只有一个实例。      例如:              

1.windows系统中只能有一个窗口管理器              

2.某个程序中只能有一个日志输出系统              

3.一个GUI类库中,有且只有一个ImageManager

单例实现

实现单例步骤

1.构造函数私有化

2.静态私有的成员作为唯一的实例

3.静态公有成员函数提供唯一访问的公共接口

单例释放就需要用到gc机制

class GC
        {
            public:~GC()
            {
                // 可以在这里销毁所有的资源,例如:db 连接、文件句柄等
                if (instance != nullptr) {
                    qDebug() << "Here destroy the m_pSingleton..." << endl;
                    delete instance;
                    instance = nullptr; //防止野指针
                }
            }
            static GC gc; // 用于释放单例
        };

MVC设计模式

MVC的英文全称为Model-View-Controller,即把一个信息系统的应用按照模型(Model)、视图(View)、控制器(Controller)的方式进行分离,这样一个应用就被分成三层:模型层、视图层和控制层。

接下来用一个例子解释什么是MVC设计模式

拿一个用户登录功能来说,其中可以将功能划分为model,view,controller

model中包括用户单例的usermodel与数据库singletonDB

--singletondb.cpp

#include "singletondb.h"
#include <QDebug>
//静态成员类外初始化
//类型名称 类名::静态成员名称=值
SingletonDB::GC SingletonDB::GC::gc;    //重要
SingletonDB* SingletonDB::instance=nullptr;

//全局静态访问函数
SingletonDB::~SingletonDB()
{
    sqlite3_close(this->pdb);
}

SingletonDB *SingletonDB::getInstance()
{
    if(nullptr==SingletonDB::instance)
    {
        SingletonDB::instance=new SingletonDB;
        qDebug()<<"create first time";
    }
    else{
        qDebug()<<"already exists";
    }
    return SingletonDB::instance;
}

int SingletonDB::doInsertUpDelete(QString sql)
{
    char *errmsg=nullptr;
    int res=sqlite3_exec(this->pdb,sql.toUtf8(),nullptr,nullptr,&errmsg);
    if(res==SQLITE_OK)
    {
        qDebug()<<"do sql success"<<sql;
        return 0;
    }
    sqlite3_errmsg(this->pdb);
    qDebug()<<"res:"<<res;
    return -1;
}

int SingletonDB::getData(QString sql,char **&qres,int &row,int &col)
{
    char *errmsg=nullptr;
    int res=sqlite3_get_table(this->pdb,sql.toUtf8(),&qres,&row,&col,&errmsg);
    if(res==SQLITE_OK)
    {
        qDebug()<<"do sql success:"<<sql;
        return 0;
    }
    sqlite3_errmsg(this->pdb);
    qDebug()<<"res:"<<res;
    return res;
}

SingletonDB::SingletonDB()//私有
{
    this->pdb=nullptr;
    //1.打开数据库
    int res=sqlite3_open("pro00.db",&this->pdb);
    if(res=SQLITE_OK)
    {
        qDebug()<<"open db success";
        return;
    }
    sqlite3_errmsg(this->pdb);
}
#ifndef SINGLETONDB_H
#define SINGLETONDB_H

#include <QString>
#include <QDebug>
#include "sqlite3.h"

class SingletonDB
{
public:
    ~SingletonDB();
    static SingletonDB* getInstance();
    int doInsertUpDelete(QString sql);

    int getData(QString sql,char **&qres,int &row,int &col);
    class GC
        {
            public:~GC()
            {
                // 可以在这里销毁所有的资源,例如:db 连接、文件句柄等
                if (instance != nullptr) {
                    qDebug() << "Here destroy the m_pSingleton..." << endl;
                    delete instance;
                    instance = nullptr; //防止野指针
                }
            }
            static GC gc; // 用于释放单例
        };
private:
    SingletonDB();  //1.构造函数私有化
    static SingletonDB* instance;   //2.静态私有的唯一实例
    sqlite3 * pdb;  //数据库连接指针
};

#endif // SINGLETONDB_H

usermodel.h/usermodel.cpp

view包括登录界面loginwidget

controller包括usercontroller进行用户验证等操作

查询其中用户判断是否登录成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值