跟着项目学设计模式(三):工厂模式

面对项目发布后的新需求,本文通过引入工厂模式重构类库,解决因频繁修改接口带来的问题,实现模块化,满足开闭原则。

接上文,项目发布后,来了一堆新需求,要增加了好多模块,有急需上线的,有正在整合中的。

某些新增的模块需要新的接口,比如增加了账单模块,需要一个生成报表的接口,这使你不得不在IProduct中添加这个新接口,而简单工厂中对接口IProduct的修改是致命的,因为修改IProduc就意味着修改所有的产品类,因为所有的产品类都实现IProduc接口,您不得不为其他模块添加空方法。这种方式显然是不能容忍的。

我们急需一种最起码能满足开闭原则的设计模式来重构我们的类库,那就是工厂模式了。

这是以前的产品接口

    public interface IProduct
    {
        bool Add(BaseEntity entity);
        bool Del(string id);
        bool Edit(string id);
        bool Select(string id);
        IList<BaseEntity> GetEntitys();
        IList<BaseEntity> GetEntitys(int pageIndex,int pageSize,out int totalCount);
    }

我们来把产品按模块(UserDal,GoodsDal,HistoryDal)分一下类,现在我们就有三个接口文件了,根据需求的不同包含不同的方法,比如日志只需要添加和查询,商品则需要增删改查分页查等等。

    public interface IUserDal
    {
        bool Add(BaseEntity entity);
        bool Del(string id);
        bool Edit(string id);
        bool Select(string id);
        IList<BaseEntity> GetEntitys();
    }

    public interface IGoodsDal
    {
        bool Add(BaseEntity entity);
        bool Del(string id);
        bool Edit(string id);
        bool Select(string id);
        IList<BaseEntity> GetEntitys(int pageIndex, int pageSize, out int totalCount);
    }

    public interface IHistoryDal
    {
        bool Add(BaseEntity entity);
        IList<BaseEntity> GetEntitys(int pageIndex, int pageSize, out int totalCount);
    }

各自的产品类只需要实现自己的接口就可以了,符合开闭原则,添加新的模块,不需要修改以前的模块。完美的解决了当前的困境。

简单工厂需要知道工厂类调用参数来消费对象,因为简单工厂只有一个产品接口,产品接口和产品是1对多的关系,所以只需要一个工厂类就能得到所有对象。而工厂模式是1对1的关系,所以这里的产品接口就是参数,也是工厂。

如果当成参数的话就需要为每类产品添加一个工厂了,网站那边需要知道每个工厂的名字就能调用了。

如果当成工厂的话,不是有依赖注入么,对象在IOC里注册了,网站那边需要知道每个接口的名字就能调用了。就用IOC吧,代码量能省好多。这貌似是个很棒的设计呀。

开始实行后,新的需求,类库这边很快就开发完了,但是开发进度却一度卡在网站开发这边了。

待续。。。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值