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 设计模式的主要问题是它给你:

  1. 单个实例 AND
  2. 全球访问。

单例的单实例方面是人们通常正在寻找的(就像你的情况),而不是全局访问。

通常的“替代方法”是声明一个 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();

单例依赖注入的“坏”方面是它不会强制 单实例。但是,如果你在任何地方都小心地使用它,你可以在所有地方传递一个单一的实例,而不是全局访问,这将有更多的好处。