iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0

前言

今天來說一個跟昨天的工廠方法模式有點像的...
Abstract Factory~抽象工廠模式!!

看這篇前建議先去看前一天的工廠方法模式歐~~
點我去Day07-工廠方法模式~

定義


Abstract Factory is a creational design pattern that lets you produce families of related objects without specifying their concrete classes.
-- Refactoring Guru

抽象工廠模式是一種創建型設計模式,它允許你創建相關的物件家族,而無需指定它們的具體類別。

什麼意思呢?🤔

Abstract抽象 意思是隱藏一些資訊,而Factory工廠 是生產產品的地方,Pattern是一種設計;
所以Abstract Factory Pattern是一種軟體設計模式,
提供了一個方法來封裝一群各自獨立,但又有相似內容的工廠。

換句話說~

可以想像成抽象工廠模式是一種超級工廠,
它是製造工廠的工廠!
它提供一個介面來製造給相似/有關連性的物件,
但具體製作什麼物件就留給Concrete Factory class來做。

抽象工廠模式架構


抽象工廠模式架構有以下五個要點:

  • 抽象工廠(Abstract Factory):
    • 這是一個介面或抽象類別,它聲明了一組創建相關物件的抽象方法。每個具體的工廠都必須實現這個介面或繼承這個抽象類別。
    • 抽象工廠通常包含多個方法,每個方法用於創建一種相關產品。
  • 具體工廠(Concrete Factory):
    • 每個具體工廠實現了抽象工廠中所說的方法,用於創建一組相關的具體產品。
    • 每個具體工廠通常專門負責創建一個特定的產品家族。
  • 抽象產品(Abstract Product):
    • 這是一個介面或抽象類別,它宣告了一個產品的通用介面。所有具體產品都必須實現這個介面或繼承這個抽象類別。
  • 具體產品(Concrete Product):
    • 每個具體產品實現了抽象產品中宣告的方法,提供了具體的實現細節。
  • 客戶端 (Client)
    • 經由Interface宣告AbstractFactory和AbstractProduct的classes,這些class會用Abstract Factory 和Abstract Product的介面來創建一系列的物件。

舉個例吧!


那我們再延伸昨天的點心店例子吧~~

店裡生意大賣!於是我們決定再擴展店面,
同時想要把點心口味根據所在地區做一些微調
於是我們有了北部的台北點心工場,以及南部的台南點心工廠

首先,定義抽象工廠介面和相關的抽象類別:

// 抽象工廠介面
public interface IDessertFactory
{
    IDessert CreateDessert(); // 創建點心
    IDrink CreateDrink();     // 創建飲料
}

// 抽象點心介面
public interface IDessert
{
    void DisplayInfo();
}

// 抽象飲料介面
public interface IDrink
{
    void DisplayInfo();
}

然後,實現具體的點心和飲料類別:

// 鳳梨酥點心
public class PineappleCake : IDessert
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is Pineapple Cake.");
    }
}

// 麻糬點心
public class Mochi : IDessert
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is Mochi.");
    }
}

// 珍珠奶茶飲料
public class BubbleTea : IDrink
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is Bubble Tea.");
    }
}

接下來,更新台南工廠以生產鳳梨酥、麻糬和珍珠奶茶,以及台北工廠以生產鳳梨酥、麻糬和珍珠奶茶:

// 台南點心工廠
public class TainanDessertFactory : IDessertFactory
{
    public IDessert CreateDessert()
    {
        return new Mochi(); // 麻糬
    }

    public IDrink CreateDrink()
    {
        return new BubbleTea(); // 珍珠奶茶
    }

    public IDessert CreatePineappleCake()
    {
        return new PineappleCake(); // 鳳梨酥
    }
}

// 台北點心工廠
public class TaipeiDessertFactory : IDessertFactory
{
    public IDessert CreateDessert()
    {
        return new Mochi(); // 麻糬
    }

    public IDrink CreateDrink()
    {
        return new BubbleTea(); // 珍珠奶茶
    }

    public IDessert CreatePineappleCake()
    {
        return new PineappleCake(); // 鳳梨酥
    }
}

最後,在我們的客戶端程式碼~~

class Program
{
    static void Main(string[] args)
    {
        // 使用台南點心工廠創建點心和飲料
        IDessertFactory tainanFactory = new TainanDessertFactory();
        IDessert tainanDessert = tainanFactory.CreateDessert();
        IDrink tainanDrink = tainanFactory.CreateDrink();
        IDessert tainanPineappleCake = tainanFactory.CreatePineappleCake();

        Console.WriteLine("TaiNan Factory:");
        tainanDessert.DisplayInfo();
        tainanDrink.DisplayInfo();
        tainanPineappleCake.DisplayInfo();

        Console.WriteLine();

        // 使用台北點心工廠創建點心和飲料
        IDessertFactory taipeiFactory = new TaipeiDessertFactory();
        IDessert taipeiDessert = taipeiFactory.CreateDessert();
        IDrink taipeiDrink = taipeiFactory.CreateDrink();
        IDessert taipeiPineappleCake = taipeiFactory.CreatePineappleCake();

        Console.WriteLine("Taipei Factory:");
        taipeiDessert.DisplayInfo();
        taipeiDrink.DisplayInfo();
        taipeiPineappleCake.DisplayInfo();
    }
}

結束!!


上一篇
[Day07] Design Pattern - Factory Method工廠方法模式
下一篇
[Day09] Design Pattern - Singleton
系列文
Design Pattern - 無所不在的設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言