工厂类:
@Service
public class ProducerFactory {
public Map<FactoryTypeEnum, BaseProducer> producerMap;
//Autowired注解作用在方法上会在初始化时执行该方法,如果该方法有参数,会使用autowired的方式在容器中查找是否有该参数
@Autowired
public ProducerFactory(List<BaseProducer> producers) {
producerMap = producers.stream()
.collect(Collectors.toMap(BaseProducer::getFactoryType, Function.identity(), (x, y) -> x));
}
public BaseProducer getProducer(FactoryTypeEnum factoryTypeEnum) {
return producerMap.get(factoryTypeEnum);
}
}
生产接口:
public interface BaseProducer {
FactoryTypeEnum getFactoryType();
ProducerResult execute(ProducerContext context);
}
生产类型枚举:
public enum FactoryTypeEnum {
RED(1, "红包"),
LOTTERY(2, "抽奖");
private int type;
private String desc;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
FactoryTypeEnum(int type, String desc) {
this.type = type;
this.desc = desc;
}
}
抽奖工厂:
@Service
public class LotteryFactory implements BaseProducer
{
@Override
public FactoryTypeEnum getFactoryType() {
return FactoryTypeEnum.LOTTERY;
}
@Override
public ProducerResult execute(ProducerContext context) {
System.out.println("执行抽奖");
return null;
}
}
红包工厂:
@Service
public class RedProducer implements BaseProducer {
@Override
public FactoryTypeEnum getFactoryType() {
return FactoryTypeEnum.RED;
}
@Override
public ProducerResult execute(ProducerContext context) {
System.out.println("执行红包");
return null;
}
}
其余bo:
public class ProducerContext {
}
public class ProducerResult {
}
测试类:
@SpringBootTest
class ApplicationTests {
@Autowired
private ProducerFactory producerFactory;
@Test
public void test() {
System.out.println(producerFactory.getProducer(FactoryTypeEnum.RED));
System.out.println(producerFactory.getProducer(FactoryTypeEnum.LOTTERY));
}
}
裱墙上了