spring增强抽象工厂

This commit is contained in:
fujiayang
2022-04-08 14:21:13 +08:00
parent d81b7beb05
commit a6c22cd132
10 changed files with 271 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after;
import org.springframework.stereotype.Component;
import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormDataHandler;
/**
* TODO:
*
* @author F嘉阳
* @date 2022/4/8 14:14
*/
@Component
public class FormDataHandlerFactory extends StrategyFactory<String, FormDataHandler> {
/**
* 获取策略的类型(交给子类去实现)
*
* @return 策略的类型
*/
@Override
protected Class<FormDataHandler> getStrategyType() {
return FormDataHandler.class;
}
}

View File

@@ -0,0 +1,24 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after;
import org.springframework.stereotype.Component;
import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemConverter;
import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemTypeEnum;
/**
* TODO:
*
* @author F嘉阳
* @date 2022/4/8 14:17
*/
@Component
public class FormItemConverterFactory extends StrategyFactory<FormItemTypeEnum, FormItemConverter> {
/**
* 获取策略的类型(交给子类去实现)
*
* @return 策略的类型
*/
@Override
protected Class<FormItemConverter> getStrategyType() {
return FormItemConverter.class;
}
}

View File

@@ -0,0 +1,15 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after;
/**
* TODO:
*
* @author F嘉阳
* @date 2022/4/8 13:42
*/
public interface Strategy<T> {
/**
* 获得策略的标识
*/
T getId();
}

View File

@@ -0,0 +1,60 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after;
import com.google.common.collect.Maps;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.Collection;
import java.util.Map;
/**
* TODO:
*
* @author F嘉阳
* @date 2022/4/8 13:42
*/
public abstract class StrategyFactory<T, S extends Strategy<T>> implements InitializingBean, ApplicationContextAware {
private Map<T, S> strategyMap;
private ApplicationContext appContext;
/**
* 根据策略 id 获得对应的策略的 Bean
*
* @param id 策略 id
* @return 策略的 Bean
*/
public S getStrategy(T id) {
return strategyMap.get(id);
}
/**
* 获取策略的类型(交给子类去实现)
*
* @return 策略的类型
*/
protected abstract Class<S> getStrategyType();
@Override
public void afterPropertiesSet() throws Exception {
// 获取 Spring 容器中,所有 S 类型的 Bean
Collection<S> strategies = appContext.getBeansOfType(getStrategyType()).values();
strategyMap = Maps.newHashMapWithExpectedSize(strategies.size());
// 将所有 S 类型的 Bean 放入到 strategyMap 中
for (final S strategy : strategies) {
T id = strategy.getId();
strategyMap.put(id, strategy);
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
appContext = applicationContext;
}
}

View File

@@ -0,0 +1,10 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean;
/**
* TODO:
*
* @author F嘉阳
* @date 2022/4/8 14:16
*/
public class CommonResponse<T> {
}

View File

@@ -0,0 +1,25 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean;
import top.fjy8018.designpattern.pattern.behavior.strategy.spring.FormSubmitRequest;
import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after.Strategy;
/**
* TODO:
*
* @author F嘉阳
* @date 2022/4/8 13:37
*/
public interface FormDataHandler extends Strategy<String> {
/**
* 获得策略的标识
*/
@Override
default String getId() {
return getFormCode();
}
String getFormCode();
CommonResponse<Object> submit(FormSubmitRequest request);
}

View File

@@ -0,0 +1,26 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean;
import top.fjy8018.designpattern.pattern.behavior.templatemethod.spring.bean.FormItem;
import top.fjy8018.designpattern.pattern.behavior.templatemethod.spring.bean.FormItemConfig;
import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after.Strategy;
/**
* TODO:
*
* @author F嘉阳
* @date 2022/4/8 13:40
*/
public interface FormItemConverter extends Strategy<FormItemTypeEnum> {
/**
* 获得策略的标识
*/
@Override
default FormItemTypeEnum getId() {
return getType();
}
FormItemTypeEnum getType();
FormItem convert(FormItemConfig config);
}

View File

@@ -0,0 +1,10 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean;
/**
* TODO:
*
* @author F嘉阳
* @date 2022/4/8 13:39
*/
public enum FormItemTypeEnum {
}

View File

@@ -0,0 +1,39 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormDataHandler;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* TODO:
*
* @author F嘉阳
* @date 2022/4/8 13:36
*/
@Component
public class FormDataHandlerFactory {
private static final
Map<String, FormDataHandler> FORM_DATA_HANDLER_MAP = new HashMap<>(16);
/**
* 根据表单标识,获取对应的 Handler
*
* @param formCode 表单标识
* @return 表单对应的 Handler
*/
public FormDataHandler getHandler(String formCode) {
return FORM_DATA_HANDLER_MAP.get(formCode);
}
@Autowired
public void setFormDataHandlers(List<FormDataHandler> handlers) {
for (FormDataHandler handler : handlers) {
FORM_DATA_HANDLER_MAP.put(handler.getFormCode(), handler);
}
}
}

View File

@@ -0,0 +1,39 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemConverter;
import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemTypeEnum;
import java.util.EnumMap;
import java.util.List;
/**
* TODO:
*
* @author F嘉阳
* @date 2022/4/8 13:38
*/
@Component
public class FormItemConverterFactory {
private static final
EnumMap<FormItemTypeEnum, FormItemConverter> CONVERTER_MAP = new EnumMap<>(FormItemTypeEnum.class);
/**
* 根据表单项类型获得对应的转换器
*
* @param type 表单项类型
* @return 表单项转换器
*/
public FormItemConverter getConverter(FormItemTypeEnum type) {
return CONVERTER_MAP.get(type);
}
@Autowired
public void setConverters(List<FormItemConverter> converters) {
for (final FormItemConverter converter : converters) {
CONVERTER_MAP.put(converter.getType(), converter);
}
}
}