单例模式和MVC模式
单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为(系统的全局控制器)。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
一些资源管理器常常设计成单例模式。
在计算机系统中,需要管理的资源包括软件外部资源,譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中。每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。 每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。
单例设计模式,通过设计一个控制类,对整个程序实行中央集权控制。在MVC设计模式中,即Model-View-Controller architecture中,可以利用单例模式进行控制器controller的设计,以强制性的实现输入、处理和输出分开。
MVC是 模型(Model),视图(View)和控制(Controller)的缩写,实现系统的职能分工。其中Model层实现系统中的业务逻辑, View层用于与用户的交互; Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。
以下是一个简单的单例模式C++实例:
singleton.h
//单例类的C++实现
class Singleton
{
private:
Singleton();//注意:构造方法私有
virtual ~Singleton();
static Singleton* instance;//惟一实例
int var;//成员变量(用于测试)
public:
static Singleton* GetInstance();//工厂方法(用来获得实例)
int getVar();//获得var的值
void setVar(int);//设置var的值
};
singleton.cpp
//构造方法实现
#include <iostream>
#include "singleton.h"
using namespace std;
Singleton::Singleton()
{
this->var = 20;
cout<<"Singleton Constructor"<<endl;
}
/*
Singleton::~Singleton()
{
delete instance;
}
*/
Singleton::~Singleton()
{
if(instance != NULL)
{
delete instance;
}
}
//初始化静态成员
//Singleton* Singleton::instance=new Singleton();
Singleton* Singleton::instance=NULL;
Singleton* Singleton::GetInstance()
{
if(instance == NULL)
{
instance = new Singleton();
}
return instance;
}
//seter && getter含数
int Singleton::getVar()
{
return this->var;
}
void Singleton::setVar(int var)
{
this->var = var;
}
Test.cpp
#include <iostream>
#include "singleton.h"
using namespace std;
//main
int main(int argc, char* argv[])
{
Singleton *ton1 = Singleton::GetInstance();
Singleton *ton2 = Singleton::GetInstance(); //只有一个实例
cout<<"ton1 var = "<<ton1->getVar()<<endl;
ton1->setVar(150);//只有一个实例,和有点类似引用的感觉
cout<<"ton2 var = "<<ton2->getVar()<<endl;
return 0;
}
简单说明:
1、构造方法私有,那么,就意味着,只能在Singleton的成员函数中,才能调用Singleton的构造函数来创建实例。在Singleton之外,不能创建Singleton对象的实例。
2、代码中,定义了GetInstance方法,只能通过GetInstance方法来获取Singleton对象的实例,单例就是在GetInstance方法中控制的。首先,Singleton有一个
static Singleton* instance;//惟一实例 Singleton* Singleton::instance=NULL;
在这里初始化为NULL
Singleton* Singleton::GetInstance()
{
if(instance == NULL)
{
instance = new Singleton();
}
return instance;
}
上面的函数,就是通过instance来实现单例的。
当第一次调用GetInstance时,instance 为NULL,所以会执行
instance = new Singleton();
把这个新建的实例保存到静态成员instance,并返回这个指针。
第二次到第N次调用GetInstance时,由于instance不为空,所以会直接返回instance 。也就是第一次调用GetInstance创建的那个实例。
所以这样就实现了,单实例。
意思就是说,Singleton对象的实例,只会被创建一次,就是说内存中,只存在一个Singleton的实例,就是所谓,单实例。
接下来是MVC模式(模块-视图-控制 模式)的一个简单例子,该例子由Qt4.8.2+Opencv2.4.2+VS2010实现
工程链接如下:
https://files.cnblogs.com/wsc36305/color_detector.rar

浙公网安备 33010602011771号