一:簡單工廠模式
設計模式分類:
創建型模式。
結構型模式。
行為模式。
23種設計模式,如何記。面向對象的系統中有很多對象,創建型模式解決的問題就是如何創建對象,何時創建對象,它努力的讓代碼不要太多的關註對象的具體類型,不用關註對象的創建細節,而知需要了解對象的抽象類型,創建對象的工作由創建對象的工廠來實現。
面向對象的系統中,對象如何組織,采用什麽樣的結構組織比較合理,這個是由結構型模式來處理的。合理的使用結構型模式可以使系統具備更好的靈活性、擴展性和維護性。
行為模式規定了各個對象間的應該具備的職責。
嚴格來說,簡單工廠模式並不是23種標準模式之一,它是工廠家族中最簡單的模式,使用這個模式可以把對象的創建和對象的使用分離開,工廠只負責對象的創建,客戶端程序調用和使用對象,客戶端程序無需創建對象。這樣對象的創建放在一起,方便維護和擴展。現實中生產鞋子的工廠負責生產鞋子,我們不需要知道生產的鞋子的具體類型。
如圖所示:右上角是一個產品接口,我們可以使用接口或抽象類來定義一個產品對象。Animal類中有一個行為吃,Animal類派生出兩個子類:Dog、Penguin。這兩個類分別實現了吃的動作,這兩個動物其實是簡單工廠中具體的產品,通過他們實現抽象的產品;這些動物該如何去創建呢,我們可以用動物工廠AnimalFactory來創建具體的動物,AnimalFactory類中有一個GetAnimal的方法,在這個方法裏我們可以根據傳進去的參數來創建具體的產品,工廠類和產品類是依賴的關系。
在客戶端,它關聯了抽象的產品類Animal和工廠類AnimalFactory,對客戶來說,他不需要了解具體的產品,只需要告訴工廠,需要什麽具體的動物,動物工廠就會根據客戶端的要求來創建某個動物,通過簡單工廠模式,使客戶端程序與具體的產品之間減少耦合度。
示例:
抽象動物類:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 簡單工廠模式 8 { 9 /* 10 動物抽象類 11 * 抽象產品 12 */ 13 public abstract class Animal 14 { 15 public abstract void Eat();16 } 17 }
具體動物狗類:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 簡單工廠模式 8 { 9 /* 10 具體的產品類,實現抽象產品類 11 */ 12 public class Dog:Animal 13 { 14 // 實現抽象方法 15 public override void Eat() 16 { 17 Console.WriteLine("狗在吃飯!"); 18 } 19 } 20 }
具體動物企鵝類:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 簡單工廠模式 8 { 9 /* 10 具體產品類,實現抽象產品類 11 12 */ 13 public class Penguin :Animal 14 { 15 // 實現抽象方法 16 public override void Eat() 17 { 18 Console.WriteLine("企鵝在吃飯!"); 19 } 20 } 21 }
動物工廠類:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 簡單工廠模式 8 { 9 /* 10 動物工廠類:實現具體的動物 11 12 */ 13 public class AnimalFactory 14 { 15 /// <summary> 16 /// 根據客戶的選擇創建動物對象 17 /// </summary> 18 /// <param name="witch">動物編號</param> 19 /// <returns></returns> 20 public Animal GetAnimal(int witch) 21 { 22 Animal am = null; 23 switch (witch) 24 { 25 case 1: 26 am = new Dog(); 27 break; 28 case 2: 29 am = new Penguin(); 30 break; 31 } 32 33 return am; 34 } 35 } 36 }
主程序調用測試
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 簡單工廠模式 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 // 得到具體的動物 (裏氏替換原則) 14 Animal am = new AnimalFactory().GetAnimal(1); 15 // 調用Eat()方法 16 am.Eat(); // 輸出狗在吃飯 17 18 Console.ReadKey(); 19 } 20 } 21 }
測試結果:
簡單工廠模式的缺點:
增加具體產品時,需要修改工廠類裏面生成具體產品的方法,這就違反了開閉原則。具體產品經常發生變化時,不建議使用簡單工廠模式。
一:簡單工廠模式