工厂模式

58 阅读3分钟

image.png

对于百度出来设计模式来说,仅仅停留在思维方面,如果你也再优化前人写的代码,这里一坨,那里一坨我相信你也十分窝火。

PrizeController prizeController = new PrizeController();

System.out.println("\r\n模拟发放优惠券测试\r\n");
// 模拟发放优惠券测试
AwardReq req01 = new AwardReq();
req01.setuId("10001");
req01.setAwardType(1);
req01.setAwardNumber("EGM1023938910232121323432");
req01.setBizId("791098764902132");
// 模拟发奖服务
AwardRes awardRes01 = prizeController.awardToUser(req01);

logger.info("请求参数:{}", JSON.toJSON(req01));
logger.info("测试结果:{}", JSON.toJSON(awardRes01));
System.out.println("\r\n模拟方法实物商品\r\n");
// 模拟方法实物商品
AwardReq req02 = new AwardReq();
req02.setuId("10001");
req02.setAwardType(2);
req02.setAwardNumber("9820198721311");
req02.setBizId("1023000020112221113");
req02.setExtMap(new HashMap<String, String>() {{
    put("consigneeUserName", "谢飞机");
    put("consigneeUserPhone", "15200292123");
    put("consigneeUserAddress", "吉林省.长春市.双阳区.XX街道.檀溪苑小区.#18-2109");
}});

AwardRes awardRes02 = prizeController.awardToUser(req02);
logger.info("请求参数:{}", JSON.toJSON(req02));
logger.info("测试结果:{}", JSON.toJSON(awardRes02));

System.out.println("\r\n第三方兑换卡(爱奇艺)\r\n");
AwardReq req03 = new AwardReq();
req03.setuId("10001");
req03.setAwardType(3);
req03.setAwardNumber("AQY1xjkUodl8LO975GdfrYUio");

AwardRes awardRes03 = prizeController.awardToUser(req03);
logger.info("请求参数:{}", JSON.toJSON(req03));
logger.info("测试结果:{}", JSON.toJSON(awardRes03));

这是对于没有使用工厂模式的业务代码

StoreFactory storeFactory = new StoreFactory();

// 1. 优惠券
ICommodity commodityService_1 = storeFactory.getCommodityService(1);
commodityService_1.sendCommodity("10001", "EGM1023938910232121323432", "791098764902132", null);

// 2. 实物商品
ICommodity commodityService_2 = storeFactory.getCommodityService(2);
Map<String,String> extMap = new HashMap<String,String>();
extMap.put("consigneeUserName", "谢飞机");
extMap.put("consigneeUserPhone", "15200292123");
extMap.put("consigneeUserAddress", "吉林省.长春市.双阳区.XX街道.檀溪苑小区.#18-2109");

commodityService_2.sendCommodity("10001","9820198721311","1023000020112221113",new HashMap<String, String>() {{
    put("consigneeUserName", "谢飞机");
    put("consigneeUserPhone", "15200292123");
    put("consigneeUserAddress", "吉林省.长春市.双阳区.XX街道.檀溪苑小区.#18-2109");
}});

// 3. 第三方兑换卡(爱奇艺)
ICommodity commodityService_3 = storeFactory.getCommodityService(3);
commodityService_3.sendCommodity("10001","AQY1xjkUodl8LO975GdfrYUio",null,null);

这是使用后的代码,看起来其实也都查不多,但是后期维护起起来是十分的方便的。 首先你你得去定义工厂类

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("不存在的商品服务类型");
}

image.png

各自的类里面会做好对于业务的处理

```
public interface ICommodity {

    void sendCommodity(String uId, String commodityId, String bizId, Map<String, String> extMap) throws Exception;

}
```
public void sendCommodity(String uId, String commodityId, String bizId, Map<String, String> extMap) throws Exception {
    DeliverReq deliverReq = new DeliverReq();
    deliverReq.setUserName(queryUserName(uId));
    deliverReq.setUserPhone(queryUserPhoneNumber(uId));
    deliverReq.setSku(commodityId);
    deliverReq.setOrderId(bizId);
    deliverReq.setConsigneeUserName(extMap.get("consigneeUserName"));
    deliverReq.setConsigneeUserPhone(extMap.get("consigneeUserPhone"));
    deliverReq.setConsigneeUserAddress(extMap.get("consigneeUserAddress"));

    Boolean isSuccess = goodsService.deliverGoods(deliverReq);

    logger.info("请求参数[优惠券] => uId:{} commodityId:{} bizId:{} extMap:{}", uId, commodityId, bizId, JSON.toJSON(extMap));
    logger.info("测试结果[优惠券]:{}", isSuccess);

    if (!isSuccess) throw new RuntimeException("实物商品发放失败");
}

这个开源代码确实不错希望大家可以多看看。 上述代码来自gitee.com/fustack/its…

image.png