U2647's blog 一个热爱学习的 Java 程序员,喜欢 Vue,喜欢深度学习 Dubbo Flutter SpringBoot Debug Notes Java LeetCode Python Redis Android DesignPattern mdi-home-outline 首页 mdi-cloud-outline 标签云 mdi-timeline-text-outline 时间轴 mdi-draw-pen 文章总数 62
设计模式-工厂方法模式 设计模式-工厂方法模式 设计模式 工厂方法模式 mdi-cursor-default-click-outline 点击量 62

1. 需求

假如我们有一个商城的项目,这个项目里的商品不是我们自己维护的,后端需要对接京东、淘宝、天猫等供应商。考虑了一下,这种情况可以使用简单工厂模式来实现。

2. 设计

类设计图入下图:

简单工厂模式结构图

每一个供应商都是一个 具体的产品,抽象产品是 Mall 类,具体的产品是 JDMall、TBMall。

工厂类是 MallFactory, 根据传过来的不同供应商的渠道产生具体的 Mall。

3. 代码结构

平台入口Controller代码:

public class MallController {

    public Goods getGoodsInfo(String sku, String channel) {
        Mall mall = MallFactory.getMall(channel);
        if (mall == null) {
            return null;
        }
        return mall.getGoodsInfo(sku);
    }

    public Order submitOrder(List<Goods> goods) {
        Mall mall = MallFactory.getMall(channel);
        if (mall == null) {
            return null;
        }
        return mall.submitOrder(goods);
    }

    //其他接口
}

工厂类 MallFactory 代码:

public class MallFactory {

    public static Mall getMall(String name) {
        if ("JD".equals(name)) {
            return new JDMall();
        }
        if ("TM".equals(name)) {
            return new TBMall();
        }
        return null;
    }
}

具体的产品 ,京东API 接口:

public class JDMall implements Mall {
    @Override
    public Goods getGoodsInfo(String sku) {
        //获取对应供应商需要的参数
        Map<String, String> extend = new HashMap<>();

        String result = HttpClientUtil.getMethod("jd/url/getGoodsInfo", extend);
        return this.getGoodsByResult(result);
    }

    @Override
    public Order submitOrder(List<Goods> goods) {
        //获取对应供应商需要的参数
        Map<String, String> extend = new HashMap<>();

        String result = HttpClientUtil.getMethod("jd/url/submitOrder", extend);
        return this.getOrderByResult(result);
    }
    //格式化返回值,适配本地模型
    private Goods getGoodsByResult(String result) {
        return new Goods();
    }
    //格式化返回值,适配本地模型
    private Order getOrderByResult(String result) {
        return new Order();
    }
}

4. 完整代码

完整代码在这里

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
我的GitHub 我的LeetCode 我的掘金
Powered by Hexo Powered by three-cards
Copyright © 2017 - {{ new Date().getFullYear() }} 某ICP备xxxxxxxx号