单例模式适用范围
在一个应用程序中,一个类有且只有一个实例,并提供一个访问它的 全局访问点。
在程序设计过程中,有很多情况需要确保一个类只有一个实例。 例如:
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进行用户验证等操作
查询其中用户判断是否登录成功