設計模式(六) 抽象工廠模式
阿新 • • 發佈:2020-12-07
設定一個場景:公司要對接兩家服務商的業務,業務是相同的,但是兩家服務商的介面表現形式是不同的,需要我們對其做一層封裝,讓它們實現我們統一的介面,以便於公司內部呼叫。
假設業務包括會員和優惠券兩個部分,首先我們需要 建立一個ErpService.Abstract專案,併為這兩個業務定義兩個統一的介面以及一個抽象工廠介面。
//會員介面 public interface IVipService { int AddVip(Vip vip); } //優惠券介面 public interface ICouponService { int AddCouponPlan(CouponPlan couponPlan); }View Codepublic class Vip { public string mobile { get; set; } public string vipName { get; set; } public short sex { get; set; } } public class CouponPlan { public int planId { get; set; } public string planName { get; set; } public string remark { get; set; } } //抽象工廠介面 public interfaceIErpServiceFactory { IVipService GetVipInstance(); ICouponService GetCouponInstance(); }
為A服務商建立一個 ErpService.A的專案,建立兩個類實現上面兩個介面,並建立一個工廠類實現抽象工廠介面
public class VipService : IVipService { public int AddVip(Vip vip) { Console.WriteLine("A服務商註冊會員"); // todo :View Codereturn 1; } } public class CouponSerivce : ICouponService { public int AddCouponPlan(CouponPlan couponPlan) { Console.WriteLine("A服務商建立券方案"); // todo : return 1; } } //A服務商服務工廠類 public abstract class AErpServiceFactory : IErpServiceFactory { public ICouponService GetCouponInstance() { return new CouponSerivce(); } public IVipService GetVipInstance() { return new VipService(); } }
接下來再為B服務商建立一個 ErpService.B的專案(做A專案同樣的操作,這裡不再用程式碼展示)。
客戶端程式碼如下:
var erpServiceFactory = new AErpServiceFactory(); var vipService = erpServiceFactory.GetVipInstance(); var couponService = erpServiceFactory.GetCouponInstance(); vipService.AddVip(new Vip() { mobile = "11", vipName = "張三", sex = 1 }); couponService.AddCouponPlan(new CouponPlan() { planId = 1, planName = "測試方案", remark = "具體細節" });View Code
如果需要呼叫B服務商的業務,只需要將AErpServiceFactory換成 BErpServiceFactory,就可以完成服務商的轉換。
以上就是 抽象工廠模式的簡單實現。
優點:
- 易於更換產品系列,通過呼叫不同的工廠,可以使用不同的產品配置。
- 使例項具體的建立過程與客戶端分離,客戶端不必知道具體實現類名。
- 易於擴充套件新的產品系列,只需為新的產品系列建立一個專案實現抽象介面即可,無需更改原有程式碼。
缺點:
- 程式碼量大,增加系統複雜度。
- 不易於擴充套件新的產品內部功能,例如增加一個積分服務,需要新增三個類(IScoreService,AScoreService,BScoreService),並且要改動原有的工廠介面增加建立積分服務例項的方法。