C#设计模式之5——生成器模式
工廠模式一般都是根據傳遞給創建方法的參數來返回不同的幾個子類的一個,不過如果我們需要的不僅僅是一個算法,還需要顯示數據,不同的子類要有不同的顯示數據方法,需要一個完全不同的用戶界面,這樣我們就可能需要生成器模式了。
?
生成器模式中,返回的并不是基本顯示對象的子類簡單代碼,而是顯示對象的不同組合構成的完全不同的用戶界面。生成器模式根據數據,以多種方式把注入顯示控件一類的許多對象組裝在一起,通過使用類表示數據,用窗體表示顯示,可以吧數據和顯示方式清晰的分離到簡單的對象中。
?
換言之,生成器模式返回的用戶界面不同,就是生成器中不同生成器根據數據的不同逐步構造最終的產品,并且最后返回這個生成器構造出來的產品,但是這個最后返回的產品卻有著不同的用戶界面。由不同的生成對象構造完全不同的用戶界面。
簡單的說就是不同類返回不同的用戶界面。
?
上面的描述可能有點費解,可以參考下面的例子。
?
有三種類型的投資:股票,債券,共同基金。我們的程序中點擊其中的一個,就可以看到這個類別下面的多種選擇,比如選擇股票以后就可以看到很多公司的股票信息;這樣就是說,有些投資可以有很多的種類,但是有些投資比如?基金可能就只有少數的幾種類別。因為這個差異,我們的程序中就需要用不同的方式給用戶顯示不同投資下的類別信息,這樣就需要不同的顯示信息。例如,某種投資下的類別很多,需要用列表框來顯示;如果某種投資下的類別少,就用復選框來表示。
?
如圖:第二列就是兩種不同的顯示方式,第一列中則表示了多種可以選擇的投資方式。
?
首先定義一個接口,用來作為所有的顯示方式的接口:
using System; using System.Collections ; using System.Windows.Forms;/// <summary>/// Summary description for MultiChoice./// </summary>public interface MultiChoice{ArrayList getSelected();void clear();Panel getWindow();}
接口中規定了返回一個Panel的方法,Panel是C#中的一個容器,可以用來顯示一些窗體控件。Panel類可以放在窗體中指定的位置。當顯示發生改變以后,我們把舊的Panel移除,然后添加新的Panel.
然后我們需要的兩種顯示方式分別為:CheckChoice和ListChoice,這兩種顯示方式應該都從接口中繼承而來,這樣也可以通過接口來訪問兩個類的實例。
?
創建一個所有投資類型的抽象基類:
using System; using System.Collections ;/// <summary>/// Summary description for Equities./// </summary>public abstract class Equities {protected ArrayList array;public abstract string ToString();//---------- public ArrayList getNames() {return array;}//---------- public int count() {return array.Count ;}}
?
然后就可以繼承這個抽象類來實現每個具體的投資類型的類了,每個投資類型的類在構造函數中添加這個類中包含的類型。
股票類:
using System; using System.Collections ;/// <summary>/// Summary description for Stocks./// </summary>public class Stocks:Equities {public Stocks() {array = new ArrayList();array.Add ("Cisco");array.Add ("Coca Cola");array.Add ("GE");array.Add ("Harley Davidson");array.Add ("IBM");array.Add ("Microsoft");}public override string ToString() {return "Stocks";}}
債券類:
共同基金類:
?
這三個子類都重寫了父類的ToString()方法,可以通過多態性進行訪問。
?
然后我們需要一個很小的類來決定返回一個CheckChoice類還是ListChoice類,我們把這個類稱為StockFactory,不過我們這里永遠都只需要一個這個類的實例,所以把這個決定返回什么類的方法定義為靜態的,這樣就只用通過類名調用就可以了。這里用到了簡單工廠模式。
using System;/// <summary>/// Summary description for StockFactory./// </summary>public class StockFactory{public static MultiChoice getBuilder(Equities stocks){if (stocks.count ()<=3) {return new CheckChoice (stocks);}else {return new ListChoice(stocks);}}}
這一簡單工廠被成為是導向器,而派生于MultiChoice的CheckChoice和ListChoice兩個類才是真正的生成器。 這里的生成器根據傳送過來的數據逐步的構造最終的產品,然后把這個最終的返回返回給調用者,呈現給用戶的則是完全不同的用戶界面。
?
CheckChoice類:
using System; using System.Collections ; using System.Windows.Forms ; using System.Drawing ;//returns a panel of 0 to 3 check boxespublic class CheckChoice:MultiChoice {private ArrayList stocks;private Panel panel;private ArrayList boxes;//------public CheckChoice(Equities stks) {stocks = stks.getNames ();panel = new Panel ();boxes = new ArrayList ();//add the check boxes to the panelfor (int i=0; i< stocks.Count; i++) {CheckBox ck = new CheckBox ();//position themck.Location = new Point (8, 16 + i * 32);string stk = (string)stocks[i];ck.Text =stk;ck.Size = new Size (112, 24);ck.TabIndex =0;ck.TextAlign = ContentAlignment.MiddleLeft ;boxes.Add (ck);panel.Controls.Add (ck);}}//------//uncheck all check boxespublic void clear() {for(int i=0; i< boxes.Count; i++) {CheckBox ck = (CheckBox)boxes[i];ck.Checked =false;}}//------//return list of checked itemspublic ArrayList getSelected() {ArrayList sels = new ArrayList ();for(int i=0; i< boxes.Count ; i++) {CheckBox ck = (CheckBox)boxes[i];if (ck.Checked ) {sels.Add (ck.Text );}}return sels;}//------//return panel of checkboxespublic Panel getWindow() {return panel;}}
ListChoice類:
C#中的ListBox不僅可以使用字符串來填充,還可以使用對象類型來填充。
在主窗體的初始化過程中,就給投資類型的列表中填充不同的對象:
private Container components = null;private Button btPlot;private Panel pnl;private MultiChoice mchoice;private void init() {lsEquities.Items.Add (new Stocks());lsEquities.Items.Add (new Bonds());lsEquities.Items.Add (new Mutuals());}
這個時候,如果單擊左側列表,就會出發相應的事件,然后在事件處理程序中,判斷選擇的對象類型,然后根據這個類型進行生成器創建,這樣就最終給用戶顯示不同的界面。
?
Equities eq = (Equities)lsEquities.Items[i];? // 這里根據用戶選擇的投資類型,通過一個抽象基類的引用指向實際的投資類型實例。
mchoice= StockFactory.getBuilder (eq);??? //? 這里通過簡單工廠調用不同的生成器構造最終的產品。
?
繪制圖標則根據用戶選擇的某種投資類型下的列別進行信息輸出
類別之間的關系圖:
?
?
總結: 生成器模式主要的意思就是, 導向器調根據數據用不同的生成器,不同的生成器則根據數據逐步的構造最終產品,然后把這個最終產品返回給用戶,呈現出完全不同的仙湖界面。
?
生成器允許改變其生成的產品的內部表示,并且隱藏了產品組裝的過程的細節。
每個特定的生成器都能獨立于其他的生成器和程序的其他部分,提高了模塊化程度并且使得添加其他的生成器變得簡單。
因為每個生成器都是根據數據來逐步的構造出最終的產品,因此對生成器構造的每個最終產品可以擁有更多的控制。
總結
以上是生活随笔為你收集整理的C#设计模式之5——生成器模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spleetergui2.9汉化版下载
- 下一篇: AE中图层叠加模式的中英对照及说明