java23种设计模式(一) -- 工厂方法模式(创建型设计模式)

工厂方法模式介绍

工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

这种设计模式也是 Java 开发中最常见的一种模式,它的主要意图是定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

简单说就是为了提供代码结构的扩展性,屏蔽每一个功能类中的具体实现逻辑。让外部可以更加简单的只是知道调用即可,同时,这也是去掉众多ifelse的方式。当然这可能也有一些缺点,比如需要实现的类非常多,如何去维护,怎样减低开发成本。但这些问题都可以在后续的设计模式结合使用中,逐步降低。

工厂方法模式非常符合“开闭原则”,当需要增加一个新的产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须修改原有系统。同时在工厂方法模式中用户只需要知道生产产品的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。虽然他很好的符合了“开闭原则”,但是由于每新增一个新产品时就需要增加两个类,这样势必会导致系统的复杂度增加。

工厂模式代码

在这里插入图片描述

ICommodity

package com.kimwu.design.factory.service;

import java.util.Map;

/**
 * 所有的奖品无论是实物、虚拟还是第三方,都需要通过我们的程序实现此接口进行处理,以保证最终入参出参的统一性。
 * 接口的入参包括;用户ID、奖品ID、业务ID以及扩展字段用于处理发放实物商品时的收获地址。
 */
public interface ICommodity {

    void sendCommodity() throws Exception;

}


GoodsCommodityService

package com.kimwu.design.factory.service.impl;

import com.alibaba.fastjson.JSON;
import com.kimwu.design.factory.service.ICommodity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
 * 实物奖励实现类
 */
public class GoodsCommodityService implements ICommodity {

    private Logger logger = LoggerFactory.getLogger(GoodsCommodityService.class);

    @Override
    public void sendCommodity() throws Exception {
        logger.info("实物奖励发放");
    }
}

CouponCommodityService

package com.kimwu.design.factory.service.impl;

import com.alibaba.fastjson.JSON;
import com.kimwu.design.factory.service.ICommodity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
 * 优惠卷奖励实现类
 */
public class CouponCommodityService implements ICommodity {

    private Logger logger = LoggerFactory.getLogger(CouponCommodityService.class);

    @Override
    public void sendCommodity() throws Exception {
        logger.info("优惠券奖励发放");
    }

}

CardCommodityService

package com.kimwu.design.factory.service.impl;

import com.alibaba.fastjson.JSON;
import com.kimwu.design.factory.service.ICommodity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
 * 兑换卡奖励实现类
 */
public class CardCommodityService implements ICommodity{

    private Logger logger = LoggerFactory.getLogger(CardCommodityService.class);


    @Override
    public void sendCommodity() throws Exception {
        logger.info("兑换卡奖励发放");

    }
}

StoreFactory

package com.kimwu.design.factory;

import com.kimwu.design.factory.service.ICommodity;
import com.kimwu.design.factory.service.impl.CardCommodityService;
import com.kimwu.design.factory.service.impl.CouponCommodityService;
import com.kimwu.design.factory.service.impl.GoodsCommodityService;

/**
 * 工厂实例类
 */
public class StoreFactory {

    public ICommodity getCommodityService(Integer commodityType) {
        if (null == commodityType) return null;
        if (1 == commodityType) return new CouponCommodityService();
        if (2 == commodityType) return new GoodsCommodityService();
        if (3 == commodityType) return new CardCommodityService();
        throw new RuntimeException("不存在的商品服务类型");
    }


}

编写测试类

package com.kimwu.design.factory.test;

import com.kimwu.design.factory.StoreFactory;
import com.kimwu.design.factory.service.ICommodity;
import org.junit.Test;

public class ApiTest {

    @Test
    public void testCommodity() throws Exception {
        StoreFactory storeFactory = new StoreFactory();

        // 1. 优惠券
        ICommodity commodityService_1 = storeFactory.getCommodityService(1);
        commodityService_1.sendCommodity();

        // 2. 实物商品
        ICommodity commodityService_2 = storeFactory.getCommodityService(2);

        commodityService_2.sendCommodity();

        // 3. 第三方兑换卡
        ICommodity commodityService_3 = storeFactory.getCommodityService(3);
        commodityService_3.sendCommodity();

    }
}

测试结果

在这里插入图片描述

小结

  • 从上到下的优化来看,工厂方法模式并不复杂,甚至这样的开发结构在你有所理解后,会发现更加简单了。
  • 那么这样的开发的好处知道后,也可以总结出来它的优点;避免创建者与具体的产品逻辑耦合、满足单一职责,每一个业务逻辑实现都在所属自己的类中完成、满足开闭原则,无需更改使用调用方就可以在程序中引入新的产品类型。但这样也会带来一些问题,比如有非常多的奖品类型,那么实现的子类会极速扩张。因此也需要使用其他的模式进行优化,这些在后续的设计模式中会逐步涉及到。
  • 从案例入手看设计模式往往要比看理论学的更加容易,因为案例是缩短理论到上手的最佳方式,如果你已经有所收获,一定要去尝试实操。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值