設計模式-工廠模式(Factory Method)

定義(工廠模式又稱工廠方法模式)

工廠方法模式:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法模式是以一個類的實例化延遲到其子類

Factory Method模式用于在不指定待創建對象的具體類的情況下創建對象。

Factory Method模式的主要意圖是隱藏對象創建的復雜性。Client通常不指定要創建的具體類,Client將面向接口或抽象類進行編碼,讓Factory類負責創建具體的類型。通常Factory類有一個返回抽象類或者接口的靜態方法。Client通常提供某種信息讓Factory類使用提供的信息來確定創建并返回哪個子類。

將創建子類的責任抽象出來的好處是允許Client完全無需考慮依賴類是如何創建的,這遵守依賴倒置原則(Dependency Inversion Principle,DIP)。Factory Method模式另外一個好處是把負責對象創建的代碼集中起來,如果需要修改對象生成方式,可以輕松定位并更新,而不會影響到依賴它的代碼。

在面向對象編程中,一般方法是用一個new操作符產生一個對象的實例。但是在一些情況下,用new操作符直接生成對象會帶來一些問題。首先,要使用new運算符創建一個對象必須清楚所要創建的對象的類信息,包括類名、構造函數等,而有時并不現實。其次許多類型的對象創建需要一系列的步驟,可能需要計算或取得對象的初始設置,選擇生成那個子對象實例,或在生成需要的對象之前必須生成一些輔助功能的對象。在這些情況下,新對象的建立就是一個過程,而不是一個簡單的操作。為輕松方便地完成復雜對象的創建,從而引入了工廠模式。

C#例子

    public abstract class Product
    {
        public abstract string GetName();
    }

    public class ProductA : Product
    {
        public override string GetName()
        {
            return "我是A產品!";
        }
    }
    public class ProductB:Product
    {
        public override string GetName()
        {
            return "我是B產品!";
        }
    }

    public abstract class Factory
    {
        public abstract Product CreateProduct();
    }
    public class FactoryA : Factory
    {
        public override Product CreateProduct()
        {
            return new ProductA();
        }
    }
    public class FactoryB : Factory
    {
        public override Product CreateProduct()
        {
            return new ProductB();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Factory[] factories = new Factory[2];

            factories[0] = new FactoryA();
            factories[1] = new FactoryB();

            foreach (var factory in factories)
            {
                Product product = factory.CreateProduct();
                Console.WriteLine(product.GetName());
            }
            Console.ReadLine();
        }
    }

工廠方法模式參與者:

  • Product:Product角色,定義工廠方法所創建的對象的接口
  • Product*:具體Product角色,實現Product接口
  • Factory:抽象的工廠角色,聲明工廠方法,該方法返回一個Product類型的對象。
    Factory可以定義一個工廠方法的默認實現,返回一個默認的Product對象。可以調用工廠方法以創建一個Product對象。
  • Factory*:具體的工廠角色,創建具體Product的子工廠,重寫工廠方法以返回一個Product實例

工廠方法模式適用情形

  • 當一個類不知道它所必須創建的對象的類信息的時候
  • 當一個類希望由它來指定它所創建的對象的時候
  • 當類將創建對象的職責委托給多個輔助子類中的某一個,并且希望將哪一個輔助之類是代理者這一信息局部化的時候

工廠方法模式特點

  • 使用工廠方法在一個類的內部創建對象通常比直接創建對象更靈活
  • 工廠方法模式通過面向對象的手法,將所要創建的具體對象的創建工作延遲到子類,從而提供了一種擴展的策略,較好的解決了緊耦合的關系
  • 工廠方法模式遵守依賴倒置原則(Dependency Inversion Principle,DIP)

其他

工廠方法模式與簡單工廠模式區別

  • 工廠方法模式和簡單工廠模式在結構上的不同是很明顯的。工廠方法模式的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體工廠類上。工廠方法模式可以允許很多具體工廠類從抽象工廠類中將創建行為繼承下來,從而可以成為多個簡單工廠模式的綜合,進而推廣了簡單工廠模式。
  • 工廠方法模式退化后可以變得很像簡單工廠模式。如果非常確定一個系統只需要一個具體工廠類,那么就不妨把抽象工廠類合并到具體的工廠類中去。由于只有一個具體工廠類,所以不妨將工廠方法改成為靜態方法,這時候就得到了簡單工廠模式
    /// <summary>
    /// 簡單工廠,和工廠模式對比用
    /// </summary>
    public class EasyFactory
    {
        // 簡單工廠,根據字符串創建相應的對象
        public static Product CreateProduct(String name)
        {

            switch (name)
            {
                case "A":
                    return new ProductA();
                case "B":
                    return new ProductB();
                default:
                    throw new Exception("產品不存在!");
            }
        }
    }

源碼地址

dotnet-design-patterns

其他設計模式

23種設計模式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。