設計模式之抽象工廠
上一篇我們學習了簡單工廠,知道簡單工廠是創建不同類的地方,那么這些工廠是如何創建得呢?隨着我們業務邏輯的增加,可能需要好多這種簡單工廠,我們不可能每一個都去主動創建,雖然說這樣也可以實現,但是卻不優雅而且后期維護者分不清修改重點,導致牽一發而動全身。
接下來學習如何創建通過一種方式去創建簡單工廠,那么即使需要很多工廠,也可以通過這種方式去創建,減少代碼的耦合,使其內聚性更高。
抽象工廠與工廠方法都為了解決接口選擇問題,但是實現上,抽象工廠是一個中心工廠,用於創建其它工廠的模式。
不同的實現服務(類/Server)在部分方法上是不同的,因此需要做一個接口適配,這個適配類就相當於工廠中的工廠,用於創建把不同的服務抽象為統一的接口做相同的業務。
Demo
業務:
假定現在目前有兩個物流公司A,B,他們都有發貨,取貨的業務,同時公司A,B都可以自主的去進行各自不同種類的發貨和取貨,也就是說可以自定義。如果這有這兩個公司那么很簡單,我們可以使用簡單工廠,新創建兩個工廠就可以解決,但是如果是10個或者50個公司,那么我們創建工廠就有點不合適,這個時候就得使用抽象工廠。
抽象工廠
定義的抽象工廠都是抽象類,定義了發貨,取貨的抽象方法,返回的也是抽象類。
/// <summary>
/// 抽象工廠
/// </summary>
public abstract class AbstractFactory
{
/// <summary>
/// 發貨
/// </summary>
/// <returns></returns>
public abstract ASendGood SendGood();
/// <summary>
/// 收貨
/// </summary>
/// <returns></returns>
public abstract AGetGood GetGood();
}
/// <summary>
/// 取貨 抽象類
/// </summary>
public abstract class AGetGood
{
public abstract void GetGood();
}
/// <summary>
/// 發貨 抽象類
/// </summary>
public abstract class ASendGood
{
public abstract void SendGood();
}
/// <summary>
/// 公司A抽象工廠
/// </summary>
public class CompanyAAbstractFactory : AbstractFactory
{
public override AGetGood GetGood()
{
return new CompanyAGetGood();
}
public override ASendGood SendGood()
{
return new CompanyASendGood();
}
}
/// <summary>
/// 公司B的抽象工廠
/// </summary>
public class CompanyBAbstractFactory : AbstractFactory
{
public override AGetGood GetGood()
{
return new CompanyBGetGood();
}
public override ASendGood SendGood()
{
return new CompanyBSendGood();
}
}
public class CompanyAGetGood : AGetGood
{
public override void GetGood()
{
Console.WriteLine("公司A 取貨");
}
}
public class CompanyASendGood : ASendGood
{
public override void SendGood()
{
Console.WriteLine("公司A 發貨");
}
}
class CompanyBGetGood : AGetGood
{
public override void GetGood()
{
Console.WriteLine("公司B 取貨");
}
}
class CompanyBSendGood : ASendGood
{
public override void SendGood()
{
Console.WriteLine("公司B 發貨");
}
}
定義完抽象工廠及各自的抽象類,接下來就是調用了。
static void Main(string[] args)
{
Debug.WriteLine("利用抽象工廠來實現物流公司A,B各自的發貨和取貨");
//公司A
AbstractFactory aCompanyFactory = new CompanyAAbstractFactory();
AGetGood getGood = aCompanyFactory.GetGood();
getGood.GetGood();
ASendGood sendGood = aCompanyFactory.SendGood();
sendGood.SendGood();
//公司B
AbstractFactory bCompanyFactory = new CompanyBAbstractFactory();
getGood = bCompanyFactory.GetGood();
getGood.GetGood();
sendGood = bCompanyFactory.SendGood();
sendGood.SendGood();
Console.ReadKey();
}
可以通過上面的圖片看到運行后顯示出了各自公司的取貨和發貨內容。其實對於各自物流公司來說,他們根本就不關心具體的取貨和發貨流程,只是給出動作,那么抽象工廠就會自動去找對應的實現來進行執行。
抽象工廠模式:提供一個創建產品的接口來負責創建相關或依賴的對象,而不具體明確指定具體類
抽象工廠的好處
- 將產品的創建轉移到具體工廠的子類中,將對象的創建封裝起來,減少客戶端與具體產品類之間的依賴。
- 減低系統耦合度,有利於擴展和后期維護。
對於抽象工廠來說,理解起來還是很抽象的,只有自己動手敲一遍才能更好的熟悉和運用。但是要使用的話還是得找到具體符合它的業務場景才行,有時候不要為了設計而設計,合理運用即可。
小寄語
一個人的奮斗,像懷孕一樣,日子久了,總會被看出來的。
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
我是哉說,感謝您的閱讀,如果對你有幫助,麻煩點贊,轉發 謝謝。