diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/AbstractStrategyFactory.java similarity index 63% rename from src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java rename to src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/AbstractStrategyFactory.java index 578044d..111e109 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/AbstractStrategyFactory.java @@ -6,6 +6,8 @@ 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; @@ -15,7 +17,7 @@ import java.util.Map; * @author F嘉阳 * @date 2022/4/8 13:42 */ -public abstract class StrategyFactory> implements InitializingBean, ApplicationContextAware { +public abstract class AbstractStrategyFactory> implements InitializingBean, ApplicationContextAware { private Map strategyMap; @@ -31,14 +33,6 @@ public abstract class StrategyFactory> implements Initi return strategyMap.get(id); } - /** - * 获取策略的类型(交给子类去实现) - * - * @return 策略的类型 - */ - protected abstract Class getStrategyType(); - - @Override public void afterPropertiesSet() throws Exception { // 获取 Spring 容器中,所有 S 类型的 Bean @@ -57,4 +51,22 @@ public abstract class StrategyFactory> implements Initi 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; + } } 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 index 442001c..86fed4a 100644 --- 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 @@ -10,14 +10,5 @@ import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.Fo * @date 2022/4/8 14:14 */ @Component -public class FormDataHandlerFactory extends StrategyFactory { - /** - * 获取策略的类型(交给子类去实现) - * - * @return 策略的类型 - */ - @Override - protected Class getStrategyType() { - return FormDataHandler.class; - } +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 index 007fdcb..b709deb 100644 --- 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 @@ -11,14 +11,5 @@ import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.Fo * @date 2022/4/8 14:17 */ @Component -public class FormItemConverterFactory extends StrategyFactory { - /** - * 获取策略的类型(交给子类去实现) - * - * @return 策略的类型 - */ - @Override - protected Class getStrategyType() { - return FormItemConverter.class; - } +public class FormItemConverterFactory extends AbstractStrategyFactory { }