1. 程式人生 > 實用技巧 >設計模式(六) 抽象工廠模式

設計模式(六) 抽象工廠模式

設定一個場景:公司要對接兩家服務商的業務,業務是相同的,但是兩家服務商的介面表現形式是不同的,需要我們對其做一層封裝,讓它們實現我們統一的介面,以便於公司內部呼叫。

假設業務包括會員和優惠券兩個部分,首先我們需要 建立一個ErpService.Abstract專案,併為這兩個業務定義兩個統一的介面以及一個抽象工廠介面。

//會員介面
public interface IVipService
{
    int AddVip(Vip vip);
}
//優惠券介面
public interface ICouponService
{
    int AddCouponPlan(CouponPlan couponPlan);
}
public 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 interface
IErpServiceFactory { IVipService GetVipInstance(); ICouponService GetCouponInstance(); }
View Code

為A服務商建立一個 ErpService.A的專案,建立兩個類實現上面兩個介面,並建立一個工廠類實現抽象工廠介面

public class VipService : IVipService
{
    public int AddVip(Vip vip)
    {
        Console.WriteLine("A服務商註冊會員");
        // todo :
return 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(); } }
View Code

接下來再為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),並且要改動原有的工廠介面增加建立積分服務例項的方法。