今天來說一個跟昨天的工廠方法模式有點像的...
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來做。
抽象工廠模式架構有以下五個要點:
那我們再延伸昨天的點心店例子吧~~
店裡生意大賣!於是我們決定再擴展店面,
同時想要把點心口味根據所在地區做一些微調
於是我們有了北部的台北點心工場,以及南部的台南點心工廠
首先,定義抽象工廠介面和相關的抽象類別:
// 抽象工廠介面
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();
}
}
結束!!