设计模式 之 抽象工厂模式

设定一个场景:公司要对接两家服务商的业务,业务是相同的,但是两家服务商的接口表现形式是不同的,需要我们对其做一层封装,让它们实现我们统一的接口,以便于公司内部调用。

假设业务包括会员和优惠券两个部分,首先我们需要 创建一个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();
}

为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();
    }
}

接下来再为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 = "具体细节"
});

如果需要调用B服务商的业务,只需要将AErpServiceFactory换成 BErpServiceFactory,就可以完成服务商的转换。

以上就是 抽象工厂模式的简单实现。

优点:

  • 易于更换产品系列,通过调用不同的工厂,可以使用不同的产品配置。
  • 使实例具体的创建过程与客户端分离,客户端不必知道具体实现类名。
  • 易于扩展新的产品系列,只需为新的产品系列创建一个项目实现抽象接口即可,无需更改原有代码。

缺点:

  • 代码量大,增加系统复杂度。
  • 不易于扩展新的产品内部功能,例如增加一个积分服务,需要新增三个类(IScoreService,AScoreService,BScoreService),并且要改动原有的工厂接口增加创建积分服务实例的方法。
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lijingguang

有钱捧个钱场,没钱捧个人场

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值