单例模式能保证类仅有一个实例,并提供一个访问他的全局的访问点。
设计窗口常常需要获取其他某个窗口的指针,以下图为例:
![单例模式的应用 单例模式的应用](https://i-blog.csdnimg.cn/blog_migrate/6e695441b3bce8836ff3309dc07e9285.jpeg)
要在QAChildDialog里面获取主界面QMainWindows对象的指针,可以通过如下代码完成:
this->parentWidget()->parentWidget();
缺点:如果对话框移到其它的窗口的模块下,或者窗口的层次发生了变化,代码就得做出修改。
换一种方案,采用单例模式设计Singleton 类,记录主界面的指针,提供一个全局的访问点。
class Singleton
{
private:
Singleton (void);
QWidget * mainWidget;
public:
virtual ~Singleton (void);
public:
static Singleton * GetInstance();
void SetMainWindow(QWidget* mainwin);
QWidget*GetMainWindow();
}
构造函数设为私有,以保证客户端不能直接创建Singleton的对象:
Singleton ::Singleton (void)
{
mainWidget= NULL;
}
析构函数:
Singleton ::~Singleton (void)
{
}
用户只能通过访问Singleton的静态函数GetInstance()接口获取实例,实例设置为static类型,确保整个程序运行阶段Singleton只有一份实例:
Singleton * Singleton ::GetInstance()
{
static Singleton singleton ;
return &singleton ;
}
注册主窗口指针
void Singleton ::SetMainWindow( QWidget* mainwin )
{
mainWidget = mainwin;
}
获取主窗口指针
QWidget* Singleton ::GetMainWindow()
{
return mainWidget;
}
客户端调用:
在主窗口QMainWindows的构造函数中,调用Singleton ::GetInstance()->SetMainWindow(this);就把主窗口的指针注册到单例中了。
在其他的窗口中,如果要访问主窗口的指针,直接调用Singleton ::GetInstance()->GetMainWindow();就可得到主窗口的指针。
优点:在窗口层次或者窗口本身发生变化,获取主界面指针的代码都不需要修改。