《重学Java设计模式》之 工厂方法模式

《重学Java设计模式》之 建造者模式

《重学Java设计模式》之 原型模式

《重学Java设计模式》之 单例模式

模拟发奖多种商品

工程结构

奖品发放接口

java 复制代码
package com.yys.mes.design.factory.store;

public interface ICommodity {

    /**
     * @Author Sherry
     * @Date 14:20 2024/11/6
     **/
    void sendCommodity(String uId, String commodityId, String bizId);
}

购物卡发放实现类

java 复制代码
package com.yys.mes.design.factory.store.impl;

import com.yys.mes.design.factory.store.ICommodity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;


@Service
@Slf4j
public class CardCommodityService implements ICommodity {

    @Override
    public void sendCommodity(String uId, String commodityId, String bizId) {
        //购物卡
        log.info("购物卡发放成功!");
    }
}

优惠券发放实现类

java 复制代码
package com.yys.mes.design.factory.store.impl;

import com.yys.mes.design.factory.store.ICommodity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
@Slf4j
public class CouponCommodityService implements ICommodity {
    @Override
    public void sendCommodity(String uId, String commodityId, String bizId) {
        //优惠券发放
        log.info("优惠券发放成功!");
    }
}

实物发放实现类

java 复制代码
package com.yys.mes.design.factory.store.impl;

import com.yys.mes.design.factory.store.ICommodity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;


@Service
@Slf4j
public class GoodsCommodityService implements ICommodity {
    @Override
    public void sendCommodity(String uId, String commodityId, String bizId) {
        //实物商品
        log.info("实物商品发放成功!");
    }
}

奖品类型工厂

通过 Map<String, ICommodity> 来存储所有的实现类。Spring 会自动将所有实现了 ICommodity 接口的 Bean 注入到这个 Map 中。我们可以通过传入类型(例如 "card")来获取对应的实现类。

java 复制代码
package com.yys.mes.design.factory.config;

import com.yys.mes.design.factory.store.ICommodity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class CommodityFactory {

    private final Map<String, ICommodity> commodityServices;

    @Autowired
    public CommodityFactory(Map<String, ICommodity> commodityServices) {
        this.commodityServices = commodityServices;
    }

    // 根据类型返回对应的ICommodity实现
    public ICommodity getCommodityService(String type) {
        ICommodity commodityService = commodityServices.get(type + "CommodityService");
        if (commodityService == null) {
            throw new IllegalArgumentException("未知的奖品类型: " + type);
        }
        return commodityService;
    }
}

调用工厂

java 复制代码
package com.yys.mes.design.factory.config;

import com.yys.mes.design.factory.store.ICommodity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Component
public class StoreFactory {

    private final CommodityFactory commodityFactory;

    @Autowired
    public StoreFactory(CommodityFactory commodityFactory) {
        this.commodityFactory = commodityFactory;
    }

    public void distributeCommodity(String type, String uId, String commodityId, String bizId) {
        // 通过工厂获取对应的ICommodity实现
        ICommodity commodityService = commodityFactory.getCommodityService(type);
        commodityService.sendCommodity(uId, commodityId, bizId);
    }
}

测试验证

java 复制代码
package com.yys.mes.design.factory.Controller;

import com.yys.mes.design.factory.config.StoreFactory;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/send")
public class ExampleController {
    @Resource
    private StoreFactory storeFactory;

    @GetMapping("/distribute")
    public String distributeCommodity(@RequestParam String type, @RequestParam String uId,
                                      @RequestParam String commodityId, @RequestParam String bizId) {
        storeFactory.distributeCommodity(type, uId, commodityId, bizId);
        return "奖品发放成功!";
    }
}
相关推荐
折哥的程序人生 · 物流技术专研5 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
researcher-Jiang5 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
西门吹-禅7 小时前
java springboot N+1问题
java·开发语言·spring boot
DLYSB_7 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
weixin_BYSJ19878 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
AI小码8 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
Hui Baby8 小时前
Spring Security
java·后端·spring
IT笔记9 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
我才是银古9 小时前
构建 Java GIS 工具库:从碎片化 API 到统一抽象的设计实践
java·gis·geotools·gdal·esri
TPBoreas10 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言