gtk3 和 gtkmm 的单例模式
Singleton pattern with gtk3 and gtkmm
我正在使用 cpp 和 gtkmm3 开发一个图形用户界面应用程序。
在此应用程序中,某些小部件需要单例模式才能实现,例如 window(因为我只想在整个应用程序中使用一个 window)
这是我的头文件:
class MyWindow : public Gtk::ApplicationWindow {
public:
MyWindow(BaseObjectType *pWindow, Glib::RefPtr<Gtk::Builder> builder);
~MyWindow();
MyWindow(MyWindow const&) = delete;
void operator=(MyWindow const&) = delete;
static MyWindow* getInstance();
private:
MyWindow();
};
源文件是:
MyWindow::MyWindow(){}
MyWindow::MyWindow(BaseObjectType *pWindow, Glib::RefPtr<Gtk::Builder> refBuilder)
: Gtk::ApplicationWindow(pWindow),
builder(refBuilder) {
}
MyWindow::~MyWindow() {}
MyWindow *MyWindow::getInstance() {
static MyWindow *window;
return window;
}
我的问题是:
有没有比单例模式更合适合理的模式?
使用此模式是否适合界面小部件和 gui 应用程序?
Singleton 设计模式的主要问题是它给你:
- 单个实例 AND
- 全球访问。
单例的单实例方面是人们通常正在寻找的(就像你的情况),而不是全局访问。
通常的“替代方法”是声明一个 MyWindow
实例,然后 将其注入 给任何需要它的人。这被称为 dependency injection。所以你有这样的东西:
void DoSomeThingOnWindow(MyWindow& p_window)
{
p_window.DoSomething();
}
// At the beginning:
MyWindow window;
// Everywhere else:
DoSomeThingWithTheWindow(window);
而不是:
void DoSomeThingOnWindow()
{
// Global access:
MyWindow* window = MyWindow::getInstance();
window->DoSomething();
}
// Everywhere:
DoSomeThingWithTheWindow();
单例依赖注入的“坏”方面是它不会强制 单实例。但是,如果你在任何地方都小心地使用它,你可以在所有地方传递一个单一的实例,而不是全局访问,这将有更多的好处。
我正在使用 cpp 和 gtkmm3 开发一个图形用户界面应用程序。 在此应用程序中,某些小部件需要单例模式才能实现,例如 window(因为我只想在整个应用程序中使用一个 window) 这是我的头文件:
class MyWindow : public Gtk::ApplicationWindow {
public:
MyWindow(BaseObjectType *pWindow, Glib::RefPtr<Gtk::Builder> builder);
~MyWindow();
MyWindow(MyWindow const&) = delete;
void operator=(MyWindow const&) = delete;
static MyWindow* getInstance();
private:
MyWindow();
};
源文件是:
MyWindow::MyWindow(){}
MyWindow::MyWindow(BaseObjectType *pWindow, Glib::RefPtr<Gtk::Builder> refBuilder)
: Gtk::ApplicationWindow(pWindow),
builder(refBuilder) {
}
MyWindow::~MyWindow() {}
MyWindow *MyWindow::getInstance() {
static MyWindow *window;
return window;
}
我的问题是: 有没有比单例模式更合适合理的模式? 使用此模式是否适合界面小部件和 gui 应用程序?
Singleton 设计模式的主要问题是它给你:
- 单个实例 AND
- 全球访问。
单例的单实例方面是人们通常正在寻找的(就像你的情况),而不是全局访问。
通常的“替代方法”是声明一个 MyWindow
实例,然后 将其注入 给任何需要它的人。这被称为 dependency injection。所以你有这样的东西:
void DoSomeThingOnWindow(MyWindow& p_window)
{
p_window.DoSomething();
}
// At the beginning:
MyWindow window;
// Everywhere else:
DoSomeThingWithTheWindow(window);
而不是:
void DoSomeThingOnWindow()
{
// Global access:
MyWindow* window = MyWindow::getInstance();
window->DoSomething();
}
// Everywhere:
DoSomeThingWithTheWindow();
单例依赖注入的“坏”方面是它不会强制 单实例。但是,如果你在任何地方都小心地使用它,你可以在所有地方传递一个单一的实例,而不是全局访问,这将有更多的好处。