工廠方法模式 Factory Method
工廠方法模式是什麼?
工廠方法模式是一種生產物件的模式。
抽象工廠模式解決了什麼問題?
- 工廠模式讓Client與依賴物件分離,Client不需要為了建立物件而在自己的程式碼中加入不需要的程式碼。
- 工廠模式讓物件能夠被重複使用。
- 工廠模式可以管理和規範物件的設定與環境,避免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();
}
}
}
工廠模式實際的應用案例
- Node http/https:利用
createServer()
來建立伺服器元件。 - Dotnet Web API:Dotnet Web API會先使用
WebApplication.CreateBuilder(args)
建立App
工廠,接著使用工廠的Build()
建立伺服器元件。 - 單一職責原則:要用單一職責原則來開發程式碼,一定會遇到需要使用工廠模式的情境,例如A元件需要使用B元件,而B元件需要C、D、E等元件支援,利用工廠模式建立B元件的生產環境,不讓A元件在自己的程式碼中引入它用不到的C、D、E元件,才會符合單一職責原則。
工廠方法與抽象工廠的差別
工廠方法的目標是實作要生產的單一對象,它的結果會是一個元件。而抽象工廠的目標則是為了整合工廠方法所實作出來的元件,讓他們可以互相協作成為一個更高級的原件,它的產出會是一個由許多工廠方法組織而成的元件,同時也會有擁有許多風格不同但功能相同的差異化元件。
工廠方法的缺點
對於小型應用、需要快速開發的專案來說,可能會過於複雜。