1. 程式人生 > >C#設計模式00-簡單工廠模式

C#設計模式00-簡單工廠模式

        簡單工廠模式並不屬於GoF的23中設計模式,但是它是學習其他工廠模式的基礎和前提條件。理解了簡單工廠模式,學習工廠方法模式和抽象工廠模式會比較容易一些。

    簡單工廠模式的定義

    定義一個工廠類,他可以根據不同的引數返回不同類的例項。通常情況下,被建立的類的例項通常都具有共同的父類。

    簡單工廠模式又可以稱之為靜態工廠方法模式,因為建立物件例項的方法通常都是靜態方法。

    在簡單工廠模式中,只需要記住一點。一個簡單的引數可以即可獲得所需的物件例項。

    簡單工廠模式的UML圖如下:

   

   簡單工廠模式包含三個角色:

   1.工廠角色(Factory):該類是簡單工廠的核心,我們所需要的物件例項就是這個類幫我們建立的,它裡面有一個靜態方法GetProduct(string productType),我們通過傳入產品型別(productType)來得到我們想要的產品。

   2.抽象產品角色(AbstractProduct):該類是所有產品的父類。它可以是介面或者抽象類。只有這樣我們才能給工廠的GetProduct(string productType)方法定義返回值。

   3.實體產品(ConcreteProductA,ConcreteProductB,ConcreteProductC):這些類是簡單工廠最終要建立的目標,也是客戶端最終想要的物件例項。

 

   接下來看一下程式碼的實現:

   首先是我們的AbstractProduct(抽象產品):  我這裡把它設計為介面

    public interface AbstractProduct
    {
    }

    然後使我們的三個ConcreteProduct(實體產品)類  注意他們實現了AbstractProduct介面   

    public class ConcretProductA:AbstractProduct
    {
    }
    public class ConcretProductB:AbstractProduct
    {
    }
    public class ConcretProductC:AbstractProduct
    {
    }

    最後是我們的簡單工廠類:

public static class Factory
    {
        public static AbstractProduct GteProduct(string productType)
        {
            AbstractProduct product = null;
            switch (productType)
            {
                case "A":
                    product = new ConcretProductA();//返回實體產品A
                    break;
                case "B":
                    product = new ConcretProductB();//返回實體產品B
                    break;
                case "C":
                    product = new ConcretProductC();//返回實體產品C
                    break;
            }
            return product;
        }
    }

    最後在客戶端我們可以通過簡單工廠的靜態方法去建立我們所需要的實體產品型別,假如說我想要ConcreteProductA類的例項,程式碼如下: 

        AbstractProduct product = StaticFactory.GteProduct("A");//返回A產品
        //.....呼叫product的方法,此處省略

    到這裡簡單工廠模式基本上就給大家介紹完了。其核心非常簡單,客戶端想要什麼實體產品,就把這種產品的引數傳給工廠,然後工廠根據傳進來的引數建立對應的實體產品返回給客戶端(注意返回型別是所有實體產品的父類或者一個介面)
     接下來進一步升級和優化我們的程式碼。

 

     試想一下,在上面的客戶端程式碼中,我建立了ConcreteProductA,但是如果我想要ConcreteProductB呢?我們就必須修改原始碼了,把GeProduct(string productType)的引數改為B。這違背了前面所說的設計原則裡面的開閉原則(不理解開閉原則請參考C#設計模式前奏-面向物件設計原則)。那麼怎麼解決這個問題呢?答案是把productType儲存在配置檔案中,然後在客戶端讀取配置檔案,獲取實體產品型別,再讓簡單工廠去建立我們想要的實體產品。以後如果想變換實體產品型別,只需修改配置檔案即可。

請看以下配置檔案的程式碼和客戶端的程式碼:

  <appSettings>
    <add key="productType" value="A"/>
  </appSettings>
        static string productType = ConfigurationManager.AppSettings["productType"];
        AbstractProduct product = StaticFactory.GteProduct(productType);//返回A產品
        //.....呼叫product的方法,此處省略

最後在介紹一個簡化後的簡單工廠

 

 

 

有時候我們能為了簡化程式碼,會把簡單工廠類和抽象產品類合併為一個類(這時候抽象產品就不能是介面了),把靜態工廠方法移到抽象產品中去(注意實體產品都繼承了這個抽象產品), 請看以下程式碼              

 

public  class AbstratProduct//這是我們的抽象產品類
    {
        //這是我們的靜態工廠方法
        public static AbstractProduct GteProduct(string productType)
        {
            AbstractProduct product = null;
            switch (productType)
            {
                case "A":
                    product = new ConcretProductA();//返回實體產品A
                    break;
                case "B":
                    product = new ConcretProductB();//返回實體產品B
                    break;
                case "C":
                    product = new ConcretProductC();//返回實體產品C
                    break;
            }
            return product;
        }
    }

       最後給大家介紹一個和技術相關的付費問答平臺、閱讀平臺-技易  歡迎訪問:http://www.seekwd.com

歡迎關注官方微訊號:


        下一篇總將給大家講解工廠方法模式