1. 程式人生 > >一:簡單工廠模式

一:簡單工廠模式

returns 原則 分離 問題 簡單的 編號 tor 在一起 分享

設計模式分類:
  創建型模式。
  結構型模式。
  行為模式。

  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 }

測試結果:

技術分享

簡單工廠模式的缺點:
增加具體產品時,需要修改工廠類裏面生成具體產品的方法,這就違反了開閉原則。具體產品經常發生變化時,不建議使用簡單工廠模式。

一:簡單工廠模式