跳至主要内容

💡 抽象工廠

Abstract Factory

概述

  • 他用於創建物件的類別
  • 提供一個 interface ,並且建立相關的物件
  • 在使用時不用去指定他具體的類別

範例

  • 首先我們有一個需求,會有一個車廠來生產各式車輛

1. 先建立一個汽車的 interface

    internal interface ICar
{
/// <summary>
/// 取得車種
/// </summary>
/// <returns>車種</returns>
string GetCarType();
}

2. 實作 跑車家庭車 類別

    /// <summary>
/// 跑車
/// </summary>
internal class SportsCar : ICar
{
/// <summary>
/// 取得車種
/// </summary>
/// <returns>跑車</returns>
public string GetCarType()
{
return "Sports Car";
}
}

/// <summary>
/// 家庭式
/// </summary>
internal class FamilyCar : ICar
{
/// <summary>
/// 取得車種
/// </summary>
/// <returns>家庭車</returns>
public string GetCarType()
{
return "Family Car";
}
}

3. 建立抽象工廠 interface

    internal interface ICarFactory
{
/// <summary>
/// 創建車輛實體
/// </summary>
/// <returns></returns>
ICar CreateCar();
}

4. 實作 跑車工廠家庭車工廠

    /// <summary>
/// 跑車工廠
/// </summary>
internal class SportsCarFactory : ICarFactory
{
/// <summary>
/// 取得車輛實體
/// </summary>
/// <returns></returns>
public ICar CreateCar()
{
return new SportsCar();
}
}

/// <summary>
/// 家庭車工廠
/// </summary>
internal class FamilyCarFactory : ICarFactory
{
/// <summary>
/// 取得車輛實體
/// </summary>
/// <returns></returns>
public ICar CreateCar()
{
return new FamilyCar();
}
}

5. 實際生產


ICarFactory factory;

Console.WriteLine("請輸入要生產的車種代號:");
Console.WriteLine(@"1. 跑車
2. 家庭車");

string carNo = Console.ReadLine();

switch (carNo)
{
case "1":
factory = new SportsCarFactory();
break;
case "2":
factory = new FamilyCarFactory();
break;
default:
throw new Exception("無此車種");
}

ICar car = factory.CreateCar();
Console.WriteLine($"生產 {car.GetCarType()} X 1");

6. 結果

  • 輸入 1
  • 輸出
請輸入要生產的車種代號:
1. 跑車
2. 家庭車
1
生產 Sports Car X 1
  • 輸入 2
  • 輸出
請輸入要生產的車種代號:
1. 跑車
2. 家庭車
2
生產 Family Car X 1