设计模式之工厂方法模式(创建者模式)

设计模式遵循六大设计原则:

  • 单一职责原则(一个类和方法只做一件事)
  • 里氏替换原则(多态,子类可扩展父类)
  • 依赖倒置原则(细节依赖抽象、下层依赖上层)
  • 接口隔离原则(建立单一接口)
  • 迪米特原则(最少知道,降低耦合)
  • 开闭原则(抽象架构、扩展实现)
  • 工厂模式又称为工厂方法模式,是一种创建型设计模式。其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。
  • 主要意图是定义一个创建一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。
  • 工厂模式使其创建过程延迟到子类进行。
  • 提供代码结构的扩展性,屏蔽每一个功能类中的具体实现逻辑。
  • 示例:方法奖品请添加图片描述

代码实现

  1. 定义发放奖品接口 ICommodity

    /**
     * 定义发奖接口
     * 统一管理入参
     */
    public interface ICommodity {
        /**
         *  * 1、所有的奖品无论是实物、虚拟还是第三方,都需要通过程序实现此接口进行处理,以保证所有的入参的统一性
         * @param uId 用户id
         * @param commondityId 奖品id
         * @param bizId 业务id
         * @param map 扩展:收获地址等
         * @throws Exception
         */
        void sendCommodity(String uId, String commondityId, String bizId, Map<String,String> map) throws Exception;
    }
    
    
  2. 定义商品发放服务

    /**
     * 工厂里的组成部分之一
     * 优惠券-实现奖品发放接口
     */
    public class CouponCommodityService implements ICommodity {
    
        private Logger logger = LoggerFactory.getLogger(CouponCommodityService.class);
    
        //模拟注入
        private CouponService couponService = new CouponService();
    
        /**
         * 重写发放奖品接口
         * @param uId 用户id
         * @param commondityId 奖品id
         * @param bizId 业务id
         * @param map 扩展:收获地址等
         * @throws Exception
         */
        @Override
        public void sendCommodity(String uId, String commondityId, String bizId, Map<String, String> map) throws Exception {
            //调用服务进行发送
            couponService.sendCoupon(uId,commondityId,bizId);
    
            // 对发放结果进行处理
            System.out.println("发放完成给"+uId+"--"+commondityId);
        }
    }
    
  3. 定义商品工厂

    /**
     * 定义商品工厂类
     * 按照类型实例各种商品服务进行统一管理
     */
    public class StoreFactory {
    
        /**
         * 根据类型 提供相应的服务方法
         * 所有服务方法实现同一接口 并同统一入参 规范管理化
         * @param type
         * @return
         */
        public ICommodity getCommodityService(Integer type) {
            if (null == type) {
                System.out.println("没有此商品发放服务");
                return null;
            } else if (1 == type) {
                System.out.println("获取到优惠券发放服务");
                return new CouponCommodityService();
            } else if (2 == type) {
                System.out.println("会员卡发放服务");
                return new CardCommodityService();
            }
            // 异常问题 应throw出去  让调用者自己处理
            return null;
        }
    
    }
    
 @Test
    public void testDesign01() throws Exception {

        // 注入发放服务工厂  获取相应的发放服务进行发放
        StoreFactory storeFactory = new StoreFactory();
        storeFactory.getCommodityService(1).sendCommodity("1","1","3",null);
    }

  1. 结果

请添加图片描述

总结

  1. 避免创建者与具体的产品逻辑耦合
  2. 满足单一职责,每一个业务实现都在所属自己的类中完成
  3. 满足开闭原则,无需更改使用调用方 就可以在程序中引入新的产品类型。
  4. 但是商品众多的情况下,子类会极速扩张,因此需要与其他设计模式结合进行优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值