工廠模式
工廠模式:顧名思義就是使得這個類的作用和工廠一樣,生產產品,在這里使用,我們就是生產類。工廠模式就是生產類,創建類的模式。
其在父類中提供一個創建對象的方法,允許子類決定實例化對象的類型。
代碼綁定着具體類會導致代碼更脆弱,更缺乏彈性,不易擴展,修改困難。
針對接口編程,可以隔離掉以后系統可能發生的一大堆改變,易於擴展。
用於處理改變,並幫助我們“找出會變化的方面,把它們從不變的部分分離出來”
Demo

比如現在有一個物流公司,之前業務很單一,只做陸上物流,隨着時間的推移,市場的變化,也有了海上物流,那么如何設計出一種實現方式來應對這種在業務邏輯上的不確定性,如果后面在增加一種空中物流,那么將如何設計呢。
如何只有路上物流和海上物流,我們可以只在單獨的類中各自聲明下,后面通過if/eles方式來判斷是那個物流,從而去實現它即可。這樣做沒有問題,可以解決業務上面所面臨的問題,但是確不是軟件開發中最好的實現方式,如果你通過if/eles來實現,那么它們的耦合度太高,后期如果陸上物流發生修改,會導致修改的地方過多,且不易於擴展。
簡單實現邏輯
/// <summary>
/// 海上物流
/// </summary>
public class AtSeaLogistics
{
/// <summary>
/// 海上發貨
/// </summary>
public void SendSeaGoods(string goodName)
{
Console.WriteLine("海上 Send:"+goodName);
}
}
/// <summary>
/// 陸地物流
/// </summary>
public class LandLogistics
{
/// <summary>
/// 陸地發貨
/// </summary>
public void SendLandGoods(string goodName)
{
Console.WriteLine("陸地 Send:"+goodName);
}
}
static void Main(string[] args)
{
int logisticsType = 0; //默認為陸地運輸
Console.WriteLine("開始發貨");
if (logisticsType==0)
{
LandLogistics land = new LandLogistics();
land.SendLandGoods("Iphone 13");
}
else
{
AtSeaLogistics atSea = new AtSeaLogistics();
atSea.SendSeaGoods("海魚");
}
Console.WriteLine("發貨完成");
Console.ReadKey();
}
運行后,由於是默認陸地發貨,則調用陸地發貨模塊,進行發貨。

這其實是一種很簡單,也是我們目前寫簡單邏輯最最常用的方式,實現功能沒有問題,可是這種實現方式存在很大的隱患和不可擴展,如果后期在需要添加一種運輸方式,可能得需要在Main()方法中修改才行,運輸方式和物流的耦合性過高,且不易擴展。
下面是使用簡單工廠模式的實現,通過接口去各自實現,各自負責各自的事情,物流公司不需要知道去使用哪一種方式發貨,只需要將貨物交給發貨工廠,發貨工廠根據貨物自己來決定該使用哪一種方式發貨。
工廠模式
public interface ISendInterface
{
void SendGoods(string goodName);
}
/// <summary>
/// 陸地物流
/// </summary>
public class LandLogistics:ISendInterface
{
/// <summary>
/// 陸地發貨
/// </summary>
public void SendGoods(string goodName)
{
Console.WriteLine("陸地 Send:" + goodName);
}
///// <summary>
///// 陸地發貨
///// </summary>
//public void SendLandGoods(string goodName)
//{
// Console.WriteLine("陸地 Send:"+goodName);
//}
}
/// <summary>
/// 海上物流
/// </summary>
public class AtSeaLogistics:ISendInterface
{
/// <summary>
/// 海上發貨
/// </summary>
public void SendGoods(string goodName)
{
Console.WriteLine("海上 Send:" + goodName);
}
//public void SendSeaGoods(string goodName)
//{
// Console.WriteLine("海上 Send:"+goodName);
//}
}
/// <summary>
/// 物流管理,主要用於發貨
/// </summary>
public class LogisticsStoreFactory
{
ISendInterface sendGood = null;
public ISendInterface GetSendInterface(int type)
{
switch (type)
{
case 1:
sendGood = new LandLogistics();
break;
case 2:
sendGood = new AtSeaLogistics();
break;
default:
break;
}
return sendGood;
}
}
調用實現邏輯
LogisticsStoreFactory logisticsStore = new LogisticsStoreFactory();
//陸地運輸
ISendInterface loadSend = logisticsStore.GetSendInterface(1);
loadSend.SendGoods("Iphone 13");
//海上運輸
ISendInterface atSeaSend = logisticsStore.GetSendInterface(2);
atSeaSend.SendGoods("海魚");
Console.WriteLine("發貨完成");
Console.ReadKey();
現在基本可以看出,簡單工廠在實現過程中,不需要關注去如何實現各自的運輸,只是通過LogisticsStoreFactory工廠類來獲取實現,拿來即用就可以。這樣就實現了解耦,將調用和實現進行了拆分,不需要過多關注它是如何實現,只進行使用即可。
適用場景
- 在編碼過程中,無法預知對象類別和其具體依賴關系時,可使用簡單工廠。
- 將創建和實現分離,在不影響其它產品的時候,可自主創建,低耦合,易擴展。
實現方式
- 定義各個產品類,讓其每個類各自干各自的工作,互相不干擾。
- 先聲明一個共有的接口,讓所有的產品都實現這個接口。
- 創建一個空的工廠類,讓其擁有獲取產品的能力,且返回這個共有的接口。
- 在創建者代碼中找到對於產品構造函數的引用,將其修改為工廠方法的引用,同時將創建產品的代碼移植到工廠方法中。
小寄語
一個人的奮斗,像懷孕一樣,日子久了,總會被看出來的。
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
我是哉說,感謝您的閱讀,如果對你有幫助,麻煩點贊,轉發 謝謝。
