From d10845eb7e57fe14089c27c0ee0ce01595593187 Mon Sep 17 00:00:00 2001 From: fujiayang Date: Fri, 8 Apr 2022 14:23:28 +0800 Subject: [PATCH] =?UTF-8?q?spring=E5=A2=9E=E5=BC=BA=E6=8A=BD=E8=B1=A1?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=EF=BC=8C=E5=8F=8D=E5=B0=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tory.java => AbstractStrategyFactory.java} | 30 +++++++++++++------ .../spring/after/FormDataHandlerFactory.java | 11 +------ .../after/FormItemConverterFactory.java | 11 +------ 3 files changed, 23 insertions(+), 29 deletions(-) rename src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/{StrategyFactory.java => AbstractStrategyFactory.java} (63%) 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 { }