工廠方法模式 Factory Method

工廠方法模式是什麼?

工廠方法模式是一種生產物件的模式。

抽象工廠模式解決了什麼問題?

  1. 工廠模式讓Client與依賴物件分離,Client不需要為了建立物件而在自己的程式碼中加入不需要的程式碼。
  2. 工廠模式讓物件能夠被重複使用。
  3. 工廠模式可以管理和規範物件的設定與環境,避免Client直接建造物件時因為失誤而產生問題。

工廠模式的概念

可以想祥成跟現實中的工廠一樣生產產品給客戶,工廠生產的產品一般都會有固定的規格和原料,這樣才能夠不斷的生產一模一樣的產品,同時工廠也會提供產品所需要的各種支援,讓產品功能能夠正常的運作,而不是讓客戶自己想辦法組裝產品。

工廠模式的實作

在實作上,首先會建立產品的介面,產品介面可以視為產品的基礎規格,基礎規格一般都是這個產品最小組成元素,擁有這些元素的產品原則上都會是同樣的產品或者衍生產品。
這裡的產品介面有產品的名字和生產它的工廠的名字,使用Use()就會得到這些資訊。

接著將產品實作出來,這裡從產品介面中實作了A和B兩個產品,這兩個產品有名字,但是沒有製造它們的工廠。

接著建立工廠介面,這裡工廠介面很簡單,主要就是要有生產產品的功能,接著從介面實作出兩個工廠A和B,分別負責生產產品A和B。

最後在Main函式上執行,分別呼叫兩個工廠,利用工廠的CreateProduct()建立產品,可以看到A工廠會生產A產品,B工廠則是會生產B產品。

namespace Program
{
    interface IProduct
    {
        String Name { get; set; }
        String ProducedBy { get; set; }
        void Use()
        {
            Console.WriteLine($"Here is {Name} produced by {ProducedBy}.");
        }
    }
    class ProductA : IProduct
    {
        public String Name { get; set; }
        public String ProducedBy { get; set; }

        public ProductA(String producedBy)
        {
            Name = "Product A";
            ProducedBy = producedBy;
        }        
    }
    class ProductB : IProduct
    {
        public String Name { get; set; }
        public String ProducedBy { get; set; }

        public ProductB(String producedBy)
        {
            Name = "Product B";
            ProducedBy = producedBy;
        }        
    }
    ////////////////////////////////////////////////////
    interface IFactory
    {
        IProduct CreateProduct();
    }
    class FactoryA : IFactory
    {
        IProduct Product;
        public FactoryA()
        {
            Product = new ProductA("Factory A");
        }
        public IProduct CreateProduct()
        {
            return Product;
        }
    }
    class FactoryB : IFactory
    {
        IProduct Product;
        public FactoryB()
        {
            Product = new ProductB("Factory B");
        }
        public IProduct CreateProduct()
        {
            return Product;
        }
    }
    ////////////////////////////////////////////////////
    class App
    {
        public static void Main()
        {
            IFactory FA = new FactoryA();
            IProduct PA = FA.CreateProduct();
            PA.Use();

            IFactory FB = new FactoryB();
            IProduct PB = FB.CreateProduct();
            PB.Use();
        }
    }
}

工廠模式實際的應用案例

  1. Node http/https:利用createServer()來建立伺服器元件。
  2. Dotnet Web APIopen in new window:Dotnet Web API會先使用WebApplication.CreateBuilder(args)建立App工廠,接著使用工廠的Build()建立伺服器元件。
  3. 單一職責原則:要用單一職責原則來開發程式碼,一定會遇到需要使用工廠模式的情境,例如A元件需要使用B元件,而B元件需要C、D、E等元件支援,利用工廠模式建立B元件的生產環境,不讓A元件在自己的程式碼中引入它用不到的C、D、E元件,才會符合單一職責原則。

工廠方法與抽象工廠的差別

工廠方法的目標是實作要生產的單一對象,它的結果會是一個元件。而抽象工廠的目標則是為了整合工廠方法所實作出來的元件,讓他們可以互相協作成為一個更高級的原件,它的產出會是一個由許多工廠方法組織而成的元件,同時也會有擁有許多風格不同但功能相同的差異化元件。

工廠方法的缺點

對於小型應用、需要快速開發的專案來說,可能會過於複雜。

Last Updated:
Contributors: eisen