1. 程式人生 > >【C#】單例模式<機房重構>

【C#】單例模式<機房重構>

機房 .sh 不能 是否 gist 應用 調用方法 單例模式 sender

前言

在機房重構之前。我們學習了設計模式。在這次重構中,我們的任務就是將這些模式,加入到機房的重構中去。

如今先來解決一個最簡單的問題——窗口的超生。

假設不加以限制,結果會是這樣:

技術分享

很的不友好。那麽我們怎樣來解決問題呢?——單例模式。

單例模式

通常我們能夠讓一個全局變量使得一個對象被訪問,但他不能防止你實例化多個對象,一個最好的辦法就是,讓類自身保存它的唯一實例,這個類能夠保證沒有其它實例能夠被創建。而且它能夠提供一個訪問該實例的方法。

用法

在這裏有兩種理解。一種正確的一種錯誤的。

第一種

首先把聲明放到類的全局變量中。然後寫一個推斷是否實例化過的方法,當須要該窗口顯示時,調用該方法。代碼例如以下:(註冊)

private frmRegister fr;//聲明全局變量

private void btnRegister_Click(Object sender,EventArgs e)
{
    openRegister();
}

private void openRegister()//推斷方法
{
    if (ftb==null || ftb.IsDisposed)
    {
        ftb =new  FormToolbox();
        ftb.MdiParent = this;
        ftb.Show();
    }
}
非常顯然,這是一種面向過程的思維。窗口有沒有被實例化,須要主窗口去推斷,我們須要的是面向對象的思想。所以。這盡管能夠實現單例模式的功能。但卻不是單例模式。

另外一種

相同,須要聲明靜態類變量。可是這次是在子窗口中聲明的。然後構造一個私有的方法,外部代碼就不能通過new來實例化它。也就是說僅僅有該窗口才有資格實例化,最後在該類中寫靜態方法。代碼例如以下:

Public partial class frmRegister:Form
{
    private static frmRegister fr=null;//<span style="font-size:18px;">聲明靜態類變量</span>
    
    private frmRegister()//<span style="font-size:18px;">構造一個私有的方法</span>
    {
        InitializeComponent();
    }
    
    public static frmRegister GetInstance()//靜態的類方法,返回值就是該類的實例
    {
        if (fr == null || fr.IsDisposed)
        {
            fr = new frmRegister();
            fr.MdiParent = MDIfrmMain.ActiveForm;
        }
        return fr;
    }
}
    
這樣,我們在client調用時。僅僅須要寫:frmRegister.GetInstance().Show();就能夠了。client不用做不論什麽工作,僅僅是在須要的時候調用一下方法就能夠了。並且外部不能通過new來實例化這個窗口。由於這個窗口僅僅有一個實例化,被這個類自己保存著。

調用方法時類會推斷有沒有被實例化過,假設沒有。則實例化一個返回,假設有,則直接返回。

機房中的單例模式

盡管第一種方法不符合面向對象。可是我為什麽要寫它呢?這就和我的機房有點關系。大家都知道,機房收費系統的主界面有一張圖片。這就須要一個轉換容器的api函數去做對應的轉換,這樣一來。單例模式在實際中的應用就要多點東西,也就是在每個子窗口上都加上引用。然後在每個窗口中去做調換,我覺得這是相當麻煩而且也不是一個好辦法,所以。在重復比較下,我選擇了之前相對錯誤的做法。將推斷的權利交給主窗口。

總結

一個模式的應用並非死板的,在對的時候用對的模式,不拘泥於模式的格式,如何使系統做起來更簡單,更好用。就如何做,活學活用,才是我們學習設計模式的目的。



【C#】單例模式&lt;機房重構&gt;