我正在使用 cpp 和 gtkmm3 開發一個 gui 應用程式。在這個應用程式中,一些小部件需要單例模式來實作,例如視窗(因為我只想在整個應用程式中使用一個視窗)這是我的頭檔案:
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 應用程式?
uj5u.com熱心網友回復:
單例設計模式的主要問題是它給了你:
- 單個實體 AND
- 全球訪問。
單例的單一實體方面是人們通常正在尋找的(例如在您的情況下),而不是全域訪問。
通常的“替代方案”是宣告一個MyWindow實體,然后將其注入任何需要它的人。這稱為依賴注入。所以你有這樣的事情:
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();
單例依賴注入的“壞”一面是它不會強制執行單個實體。但是,如果您在任何地方小心地使用它,您就可以到處傳遞單個實體而沒有全域訪問權限,這將帶來更多好處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/373141.html
