此篇簡單介紹工廠模式。
關注在 :
- 針對要實例出什麼物件做思考
- 針對Return的產物
- 針對外部輸入的引數做限制
要點 :
- 使用外部輸入的引數對後續的方法來做規範
- 使用列舉來規範參數
類別圖 :
賣茶的 - 抽象類 :
using System;
namespace SimpleFactoryPattern.TeaStore
{
/// <summary>
/// 此介面為各個飲料的共同動作
/// </summary>
interface InterfaceAllTea
{
/// <summary>
/// 加料
/// </summary>
void addMaterial();
/// <summary>
/// 沖泡
/// </summary>
void brew();
/// <summary>
/// 裝杯
/// </summary>
void pouredCup();
}
}
賣茶的 - 實作類 :
using System;
namespace SimpleFactoryPattern.TeaStore
{
// 賣綠茶的
internal class GreenTea : InterfaceAllTea
{
/// <summary>
/// 加料
/// </summary>
void InterfaceAllTea.addMaterial()
{
Console.WriteLine("綠茶加料");
}
/// <summary>
/// 沖泡
/// </summary>
void InterfaceAllTea.brew()
{
Console.WriteLine("綠茶沖泡");
}
/// <summary>
/// 裝杯
/// </summary>
void InterfaceAllTea.pouredCup()
{
Console.WriteLine("綠茶裝杯");
}
}
// 賣紅茶的
internal class BlackTea : InterfaceAllTea
{
/// <summary>
/// 加料
/// </summary>
void InterfaceAllTea.addMaterial()
{
Console.WriteLine("紅茶加料");
}
/// <summary>
/// 沖泡
/// </summary>
void InterfaceAllTea.brew()
{
Console.WriteLine("紅茶沖泡");
}
/// <summary>
/// 裝杯
/// </summary>
void InterfaceAllTea.pouredCup()
{
Console.WriteLine("紅茶裝杯");
}
}
}
茶工廠類 :
using System;
namespace SimpleFactoryPattern.SimpleFactory
{
/// <summary>
/// 此工廠是對應到所有需實例的類別(使用列舉來對應)
/// </summary>
internal class SimpleFactoryClass
{
/// <summary>
/// 外部介面的選擇,好讓工廠可以依初始值來判別是否是DI介面選擇錯誤
/// </summary>
public enum ChioceInterface : int
{
Default = -1,
InterfaceAllTea = 0
};
/// <summary>
/// 關於茶功能 要實例哪種子類別?
/// </summary>
public enum TeaChioceChildClass : int
{
GreenTea = 0,
BlackTea = 1
};
/// <summary>
/// 程式內部應用為了判別IoC介面當前選擇了何種介面
/// </summary>
private ChioceInterface _chioceInterface = ChioceInterface.Default;
/// <summary>
/// 工廠初始化請選擇對應的介面,已讓工廠完成後續的動作
/// </summary>
/// <param name="paraInterfaceChioce"> 輸入欲使用的抽象類別 </param>
public SimpleFactoryClass(ChioceInterface paraInterfaceChioce)
{
switch (paraInterfaceChioce)
{
case ChioceInterface.InterfaceAllTea:
this._chioceInterface = paraInterfaceChioce; //初始化自用欄位
break;
default:
throw new NotImplementedException();
}
}
/// <summary>
/// 此為製作飲料的方法,Return 回 TeaStore.InterfaceAllTea 的實作類別
/// </summary>
/// <param name="paraTeaChioceChild"> 選擇子類別 </param>
/// <returns></returns>
public TeaStore.InterfaceAllTea createAllTeaOb(TeaChioceChildClass paraTeaChioceChild)
{
// 請先確定 欲建立的實作的抽象類別
if (this._chioceInterface != ChioceInterface.InterfaceAllTea) throw new NotImplementedException();
switch (paraTeaChioceChild)
{
case TeaChioceChildClass.GreenTea:
return new TeaStore.GreenTea(); // return 賣綠茶的
case TeaChioceChildClass.BlackTea:
return new TeaStore.BlackTea(); // return 賣紅茶的
default:
throw new NotImplementedException();
}
}
}
}
用戶端 :
using System;
namespace SimpleFactoryPattern
{
class Program
{
static void Main(string[] args)
{
// 初始化工廠 選擇欲實作的抽象類別
SimpleFactory.SimpleFactoryClass factroy1 =
new SimpleFactory.SimpleFactoryClass(SimpleFactory.SimpleFactoryClass.ChioceInterface.InterfaceAllTea);
// 使用工廠方法回傳實例
var tea = factroy1.createAllTeaOb(SimpleFactory.SimpleFactoryClass.TeaChioceChildClass.GreenTea);
tea.addMaterial();
tea.brew();
tea.pouredCup();
Console.WriteLine();
tea = null;
// 切換實作
tea = factroy1.createAllTeaOb(SimpleFactory.SimpleFactoryClass.TeaChioceChildClass.BlackTea);
tea.addMaterial();
tea.brew();
tea.pouredCup();
tea = null;
Console.Read();
}
}
}
結果顯示 :
多多指教!! 歡迎交流!!
你不知道自己不知道,那你會以為你知道