程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#機房重構——單例模式

C#機房重構——單例模式

編輯:C#入門知識

C#機房重構——單例模式


前言

在機房重構之前,我們學習了設計模式,在這次重構中,我們的任務就是將這些模式,添加到機房的重構中去。現在先來解決一個最簡單的問題——窗體的超生。

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

\

非常的不友好。那麼我們如何來解決這個問題呢?——單例模式。

單例模式

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

使用方法

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

第一種

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

 

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;//聲明靜態類變量
    
    private frmRegister()//構造一個私有的方法
    {
        InitializeComponent();
    }
    
    public static frmRegister GetInstance()//靜態的類方法,返回值就是該類的實例
    {
        if (fr == null || fr.IsDisposed)
        {
            fr = new frmRegister();
            fr.MdiParent = MDIfrmMain.ActiveForm;
        }
        return fr;
    }
}
 
這樣,我們在客戶端調用時,只需要寫:frmRegister.GetInstance().Show();就可以了,客戶端不用做任何工作,只是在需要的時候調用一下方法就可以了。而且外部不能通過new來實例化這個窗體,因為這個窗體只有一個實例化,被這個類自己保存著。調用方法時類會判斷有沒有被實例化過,如果沒有,則實例化一個返回,如果有,則直接返回。

機房中的單例模式

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

總結

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved