diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FactoryConfig.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FactoryConfig.java new file mode 100644 index 0000000..4aecb28 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FactoryConfig.java @@ -0,0 +1,27 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormDataHandler; +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:26 + */ +@Configuration +public class FactoryConfig { + + @Bean + public StrategyFactory formDataHandlerFactory() { + return new StrategyFactory<>(FormDataHandler.class); + } + + @Bean + public StrategyFactory formItemConverterFactory() { + return new StrategyFactory<>(FormItemConverter.class); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormDataHandlerFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormDataHandlerFactory.java deleted file mode 100644 index 86fed4a..0000000 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormDataHandlerFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -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 AbstractStrategyFactory { -} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormItemConverterFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormItemConverterFactory.java deleted file mode 100644 index b709deb..0000000 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormItemConverterFactory.java +++ /dev/null @@ -1,15 +0,0 @@ -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 AbstractStrategyFactory { -} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/AbstractStrategyFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java similarity index 55% rename from src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/AbstractStrategyFactory.java rename to src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java index 111e109..ae14b39 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/AbstractStrategyFactory.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java @@ -6,8 +6,6 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; import java.util.Collection; import java.util.Map; @@ -17,12 +15,23 @@ import java.util.Map; * @author F嘉阳 * @date 2022/4/8 13:42 */ -public abstract class AbstractStrategyFactory> implements InitializingBean, ApplicationContextAware { +public class StrategyFactory> implements InitializingBean, ApplicationContextAware { private Map strategyMap; private ApplicationContext appContext; + private final Class strategyType; + + /** + * 创建一个策略工厂 + * + * @param strategyType 策略的类型 + */ + public StrategyFactory(Class strategyType) { + this.strategyType = strategyType; + } + /** * 根据策略 id 获得对应的策略的 Bean * @@ -36,13 +45,14 @@ public abstract class AbstractStrategyFactory> implemen @Override public void afterPropertiesSet() throws Exception { // 获取 Spring 容器中,所有 S 类型的 Bean - Collection strategies = appContext.getBeansOfType(getStrategyType()).values(); + Collection strategies = appContext.getBeansOfType(strategyType).values(); strategyMap = Maps.newHashMapWithExpectedSize(strategies.size()); - // 将所有 S 类型的 Bean 放入到 strategyMap 中 + // 将 所有 S 类型的 Bean 放入到 strategyMap 中 for (final S strategy : strategies) { T id = strategy.getId(); + strategyMap.put(id, strategy); } } @@ -51,22 +61,4 @@ public abstract class AbstractStrategyFactory> implemen public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { appContext = applicationContext; } - - /** - * 通过反射获取策略的类型 - * - * @return 策略的类型 - */ - protected Class getStrategyType() { - // getClass 获取当前运行时实例的类,getGenericSuperclass 获得泛型父类 - Type superclass = getClass().getGenericSuperclass(); - ParameterizedType pt = (ParameterizedType) superclass; - Type[] actualTypeArguments = pt.getActualTypeArguments(); - // 获得索引为 1 的实际参数类型,即第二个实际参数的类型 - Type actualTypeArgument = actualTypeArguments[1]; - @SuppressWarnings("unchecked") - Class result = (Class) actualTypeArgument; - - return result; - } }