設計模式介紹,以飲料店為實例來實現工廠模式的情境
前言
工廠模式是很常見的設計模式,工廠模式分為兩個工廠和商品,工廠主要負責生產商品,商品主要是呈現有哪些功能和特性,就以飲料店為例子來實作工廠模式
實作簡單工廠模式
流程介紹
1.首先我們要有一個主商品模型
2.其他次商品繼承主商品的特性在另外擴充(extend)其他特性(Property)
3.工廠接收客戶(client)需求
4.產出客戶所要的商品
程式碼呈現
主商品模型
public interface IProduct
{
string Name { get; }//名稱
int Accoumt{get;}//數量
string Size{get;}//尺寸
string Ice{get;}//冰塊
string Sugar { get; }//甜度
void doclientproduct(int accoumt, string size, string ice,string sugar);//客人的需求
void doproduct();//無客製化
void info();//顯示資訊
}
次商品繼承主商品模型
商品(一)茶類
class tea:IProduct
{
private int accoumt;//數量
private string size;//尺寸
private string ice;//冰塊
private string sugar;//甜度
private string name;//名稱
public tea(){}
public tea(string name)
{
Name = name;
}
public int Accoumt
{
get
{
return accoumt;
}
set
{
accoumt = value;
}
}
public string Size
{
get
{
return size;
}
set
{
size = value;
}
}
public string Ice
{
get
{
return ice;
}
set
{
ice = value;
}
}
public string Sugar
{
get
{
return sugar;
}
set
{
sugar = value;
}
}
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
//客製化商品
public void doclientproduct(int accoumt, string size, string ice, string sugar)
{
Accoumt = accoumt;
Size = size;
Ice= ice;
Sugar = sugar;
}
//預設商品
public void doproduct()
{
Accoumt = 1;
Size = "M";
Ice = "正常";
Sugar = "正常";
}
//顯示商品資訊
public void info()
{
Console.WriteLine(name+" 尺寸:" + size + ",冰塊:" + ice +",甜度:" +sugar+",數量:" + accoumt);
}
}
商品(二) 水果類
class fruit:IProduct
{
private int accoumt;//數量
private string size;//尺寸
private string ice;//冰塊
private string sugar;//不給調甜度
private string name;//名稱
public fruit()
{
}
public fruit(string name)
{
Name = name;
}
public int Accoumt
{
get
{
return accoumt;
}
set
{
accoumt = value;
}
}
public string Size
{
get
{
return size;
}
set
{
size = value;
}
}
public string Ice
{
get
{
return ice;
}
set
{
ice = value;
}
}
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public string Sugar
{
get
{
return sugar;
}
set
{
if(value=="無糖")
sugar = value;
}
}
//客製化商品
public void doclientproduct(int accoumt, string size, string ice, string sugar="")
{
Accoumt = accoumt;
Size = size;
Ice= ice;
Sugar = "無糖";
}
//預設商品
public void doproduct()
{
Accoumt = 1;
Size = "M";
Ice = "正常";
Sugar = "無糖";
}
//顯示商品
public void info()
{
Console.WriteLine(name + " 尺寸:" + size + ",冰塊:" + ice + ",甜度:" + sugar + ",數量:" + accoumt);
}
}
接收客戶需求
static void Main(string[] args)
{
Factory store = new Factory();//生成工廠
var client1 = store.createproduct("茶類","紅茶"); //接收客戶1需求
var client2 = store.createproduct("水果類", "蘋果汁"); //接收客戶2需求
client1.doproduct(); //開始製作客戶1的飲料
client2.doclientproduct(1,"M","正常"); //開始製作客戶2的飲料
client1.info(); //顯示客戶1飲料資訊
client2.info(); //顯示客戶2飲料資訊
Console.ReadLine();
}
顯示結果
結語
優點:
- 工廠含必要的邏輯判斷,可以決定在什麼時候創建哪一個產品的實例,客戶端可以免除直接創建產品對象的責任。
- 可以減少使用者的記憶量。
- 可以在不修改客戶端資料的情況下,變更或新增具體產品,提高了系統的靈活性。
缺點:
- 工廠集中所有產品的創建邏輯,一旦無法正常使用,整個系統都受影響。
- 系統擴展困難,一旦增加新產品就不得不修改工廠邏輯,而在產品多的情況下,可能造成工廠邏輯複雜,不利於系統的擴展與維護。