今天去拔智齒🥲
咬紗布咬了好久
還要歪著頭吃粥XD
雖然臉頰在發熱但是鐵人還是要繼續!!
今天要講工廠模式了~
前三天好像花了有點多時間在實作MVC上,懊惱過後
經過一番檢討,決定改變節奏!!今天的我是全新的我!!!
Factory Method is a creational design pattern that provides an interface for creating objects in a superclass, but allows subclasses to alter the type of objects that will be created.
-- Reafctoring guru
工廠方法模式提供物件建立在superclass/parentclass的介面(interface),同時也讓subclass/childclass 決定實體化的類別(class)為何
好呀!😎
假設我們今天想要開一家台灣點心店,所以我們設了一家生產點心的工廠(可以想像成中央廚房),
一開始呢,我們店只有販售"鳳梨酥",工廠也只有生產鳳梨酥的生產線
經營了幾個月後大賣! 於是我們決定開發新的點心
來賣麻糬好了!
為什麼是麻糬?
因為我超喜歡麻糬...
所以我們現在有鳳梨酥
和麻糬
兩種點心了
挖~ 那既然我有了工廠,我們在同一間工廠再塞一個麻糬生產線吧!
先不要 🙅🏻♀️Why???
長遠的規劃下,也許點心店還會再開發新菜單呀!
難道要全部的生產線塞在同一間工廠持直到不能再塞,裡面全都亂成一團嗎?
萬一今天鳳梨酥想要開發新口味,
回頭發現我們的工廠沒位了怎麼辦
最後我們決定再設一個麻糬工廠,
店面是我們和客戶的溝通窗口(介面),
下單後通知哪個工廠該動作了~
首先,我們定義一個的Dessert(點心)interface和具體(concrete)的子類(PineappleCake和Mochi):
// 抽象的點心
// 或是interface也可
interface Dessert
{
public abstract string GetName();
}
// 具體的鳳梨酥類
class PineappleCake : Dessert
{
public override string GetName()
{
return "鳳梨酥";
}
}
// 具體的麻糬類
class Mochi : Dessert
{
public override string GetName()
{
return "麻糬";
}
}
接下來,我們定義一個抽象的點心工廠介面,它包含一個創建點心的抽象方法:
// 抽象的點心工廠介面
abstract class IDessertFactory
{
Dessert CreateDessert();
}
然後,我們建立具體的工廠,目前有鳳梨酥
和麻糬
:
// 具體的鳳梨酥工廠
class PineappleCakeFactory : IDessertFactory
{
public Dessert CreateDessert()
{
return new PineappleCake();
}
}
// 具體的麻糬工廠
class MochiFactory : IDessertFactory
{
public Dessert CreateDessert()
{
return new Mochi();
}
}
現在再client端程式碼,我們可以使用Factory Method來創建新的點心,而不需要知道具體是如何實現的
class Program
{
static void Main(string[] args)
{
IDessertFactory pineappleCakeFactory = new PineappleCakeFactory();
Dessert pineappleCake = pineappleCakeFactory.CreateDessert();
Console.WriteLine("我點了:" + pineappleCake.GetName());
IDessertFactory mochiFactory = new MochiFactory();
Dessert mochi = mochiFactory.CreateDessert();
Console.WriteLine("我點了:" + mochi.GetName());
}
}
在這個範例中,我們使用Factory來創建不同種類的點心,
客戶端的程式碼只需要和抽象點心工廠介面IDessertFactory
和點心Dessert
接觸,
而不需要了解具體是怎麼製作的,
這使得我們可以輕鬆擴展這家點心店,添加新的點心種類,建立新的工廠,
而不會影響原有的主程式碼。
Factory Method Diagram以及我們剛剛的範例對照如下
希望這樣有比較清楚~~