iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0

前言

今天去拔智齒🥲
咬紗布咬了好久
還要歪著頭吃粥XD
雖然臉頰在發熱但是鐵人還是要繼續!!

今天要講工廠模式了~
前三天好像花了有點多時間在實作MVC上,懊惱過後
經過一番檢討,決定改變節奏!!
今天的我是全新的我!!!
/images/emoticon/emoticon18.gif

什麼是Factory Method?


定義

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???

長遠的規劃下,也許點心店還會再開發新菜單呀!
難道要全部的生產線塞在同一間工廠持直到不能再塞,裡面全都亂成一團嗎?
萬一今天鳳梨酥想要開發新口味,
回頭發現我們的工廠沒位了怎麼辦

最後我們決定再設一個麻糬工廠,
店面是我們和客戶的溝通窗口(介面),
下單後通知哪個工廠該動作了~

C#概念範例


首先,我們定義一個的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接觸,
而不需要了解具體是怎麼製作的,
這使得我們可以輕鬆擴展這家點心店,添加新的點心種類,建立新的工廠,
而不會影響原有的主程式碼。

UML Diagram


Factory Method Diagram以及我們剛剛的範例對照如下

希望這樣有比較清楚~~


上一篇
[Day06] 簡易MVC CRUD實作 - 3
下一篇
[Day08] Design Pattern - Abstract Factory抽象工廠模式
系列文
Design Pattern - 無所不在的設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言