---無聊的分割線---
在面向對象程序中,我們經常看到一種模式就是簡單工廠模式(Simple Factory Pattern)。也許你也沒意識到原來你一直在使用簡單工廠模式,沒關系,很多時候我們往往只需要使用就可以了。
簡單工廠模式根據提供給它的數據,返回幾個可能類中的一個類的實例。通常它返回的類都有一個共同的父類和共同的方法,但每個方法執行的任務不同,而且根據不同的數據進行了優化。簡單工廠模式實際上不屬於23個GoF模式,但它可以作為學習工廠方法模式的一個引導。
1.先定義一個父類
//父類 public class Namer { //再次定義成員 protected string frName, lName; //返回fName public string getFrname(){ return frName; } //返回lName public string getLname(){ return lName; } }
2.定義兩個子派生類
兩個派生類繼承了Namer。並且兩個類的構造函數都將name分成兩部分。並且約定,最后一個空格后面所有的內容都屬於frName。在子類1當中,分割符是空格,在子類2當中,分隔符是逗號。
//子類1 public class FirstLast : Namer { public FirstLast(String name){ int i=name.Trim().IndexOf(" "); if(i>0){ frName=name.Substring(0,i).Trim(); lName=name.Substring(i+1).Trim(); } else{ lName=name; frName=""; } } } //子類2 public class LastFirst : Namer { public LastFirst(string name){ int i=name.IndexOf(","); if(i>0){ lName=name.Substring(0,i); frName=name.Substring(i+1).Trin(); } else{ lName=name; frName=""; } } }
這兩種情況下,我們將分拆的name保存在基類Namer中的保護變量lName和frName里。
3.構造簡單工廠
類已經准備好了,下面就需要構造一個簡單工廠。工廠做的事情很簡單,當檢測到name里面有逗號時,返回一個LastFirst對象,否則返回FirstLast對象。下面是代碼示例:
//簡單工廠 public class NameFactory{ //構造函數 public NameFactory{} //根據判斷返回不同的類 public Namer getName(string name){ int i=name.IndexOf(","); if(i>0){ return new LastFirst(name); }else{ return new FirstLast(name); } } }
4.使用工廠
假設一個輸入文本要求輸入姓名,響應button Click事件之后將姓和名分別輸入在對於的文本框。下面是代碼示例:
//使用工廠 private void btnOK_Click(object sender,System.EventArgs e){ Namer nm=nameFact.geyName(txtName.Text); txtFirst.Text=nm.getFrname(); txtLast.Text=nm.getLname(); }
在使用的時候,我們不需要知道使用的是哪一個派生類,工廠會為我們做出選擇。
結構圖示
小結
簡單工廠能夠返回具有相同方法的類的實例,他們可以是不同的派生子類的實例,也可以是實踐上毫無關系僅僅是共享了相同接口的類。不管是哪一種形式,這些實例中的方法必須是相同的,並且能夠被交替使用。
學習,從簡單開始。
所有代碼

//父類 public class Namer { //再次定義成員 protected string frName, lName; //返回fName public string getFrname(){ return frName; } //返回lName public string getLname(){ return lName; } } //子類1 public class FirstLast : Namer { public FirstLast(String name){ int i=name.Trim().IndexOf(" "); if(i>0){ frName=name.Substring(0,i).Trim(); lName=name.Substring(i+1).Trim(); } else{ lName=name; frName=""; } } } //子類2 public class LastFirst : Namer { public LastFirst(string name){ int i=name.IndexOf(","); if(i>0){ lName=name.Substring(0,i); frName=name.Substring(i+1).Trin(); } else{ lName=name; frName=""; } } } //簡單工廠 public class NameFactory{ //構造函數 public NameFactory{} //根據判斷返回不同的類 public Namer getName(string name){ int i=name.IndexOf(","); if(i>0){ return new LastFirst(name); }else{ return new FirstLast(name); } } } //使用工廠 private void btnOK_Click(object sender,System.EventArgs e){ Namer nm=nameFact.geyName(txtName.Text); txtFirst.Text=nm.getFrname(); txtLast.Text=nm.getLname(); }
參考資料:《C#設計模式》