2012-03-12 107 views
2

是否可以在單例模式之後創建模態對話框?單例模態對話框

的理念是:

public partial class Singleton : Form 
{ 
    private static Singleton _instance = null; 

    private Singleton() 
    { 
     // Initialization code 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      if (_instance == null) 
       _instance = new Singleton(); 

      return _instance; 
     } 
    } 

    private void Singleton_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     _instance.Hide(); 
     e.Cancel = true; 
    } 

    private void buttonClose_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 
} 

此代碼工作正常,如果表格處於非模態(因此,如果使用Show()方法),但如果窗體是模式不工作(所以,如果使用ShowDialog()方法),因爲這也會隱藏父窗體。

+5

爲什麼?應該解決什麼問題? – Oded 2012-03-12 16:37:41

+0

你爲什麼認爲這會隱藏父窗體? – ionden 2012-03-12 16:41:12

+0

表單必須是單例,因爲它需要很長時間才能被初始化,所以我只希望它被創建一次。我需要它是模態的,因爲我需要用戶回答 - 是或否。 – Cristiano 2012-03-12 16:41:44

回答

6

除了我的評論,不要這樣做。不要將表單/對話框設置爲單例。該對話框應該只顯示您想要顯示的數據的視圖。數據的高速緩存應該在別處處理。因此,當您創建對話框時,將它傳遞給您想要顯示的緩存對象。實質上,使用MVC模式。

  1. 我假設它是花費時間的數據,而不是對話框本身的結構。如果在對話框上構建控件的時間過長,那麼對話框可能太複雜了?
+0

我必須感謝大家的答覆,他們幫助我更好地理解問題。 – Cristiano 2012-03-12 20:31:01

0

我想,任何事情都是可能的,但:enter image description here

「就因爲你可以並不意味着你應該。」

單例具有兩個主要目的:將實例計數限制爲1併爲全局變量提供入口點。每當你決定做一個單身人士時,你對你的領域做出了一個非常具體和僵化的假設,包括你自己在內的所有未來的開發者都將受到影響。也就是說,你做出了一個(尷尬的)假設,即只有一個X可以存在。一旦你開始了這條道路,單身人士的全球性質將通過內聯客戶端調用來鎖定你,並且在以後重新思考它會變成一個痛苦的世界。

所以,問問自己:有沒有任何可能的方式可能需要支持多個對話窗口?如果這個問題的答案是或者甚至可能是「是」,那麼你不希望這樣做爲單身。如果這個問題的答案是否定的,你可能仍然不想這樣做。

+1

因爲你可以[發佈圖片]這並不意味着你應該 – 2012-03-12 17:12:00

+1

以我的經驗,直觀教具幫助,但每一個他自己。如果您對此感覺足夠強烈,請繼續進行編輯。 – 2012-03-12 17:13:20