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

版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址: https://blog.csdn.net/m0_37057454/article/details/82017864

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

某些新增的模块需要新的接口,比如增加了账单模块,需要一个生成报表的接口,这使你不得不在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吧,代码量能省好多。这貌似是个很棒的设计呀。

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

待续。。。

扫描二维码关注公众号,回复: 2925879 查看本文章

 

 

猜你喜欢

转载自blog.csdn.net/m0_37057454/article/details/82017864