栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 设计模式——工厂设计模式(创建型设计模式)实战经验分享(基于spring动态加载)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 设计模式——工厂设计模式(创建型设计模式)实战经验分享(基于spring动态加载)

背景:

1、我有一个抽象父类类且定义了泛型 暂且命名为 baseInfo
2、我有一个接口类且定义了泛型 interface 暂且命名为 ITest
3、ITest接口存在多个实现类,且泛型均为 同时通过@Service注入到IOC中
4、baseInfo抽象类总有个一个实例方法需要调用ITest接口的test方法
5、不同的T对应的ITest接口的实现类不同,且test方法内部逻辑不同
需求:
在泛型T动态未知的情况下,冬天的使用baseInfo的实例方法调用到不同的ITest实现类

知识点预研:

WebApplicationContext.getBeansOfType
可以参考一下该文章的使用

最好查看一下我写的工厂设计模式

spring 的 @PostConstruct 注解使用

思路

1、在 baseInfo 的抽象类中定义一个抽象方法:String getServiceBeanName()
每一个泛型T在继承baseInfo时实例化该方法,返回值最好保证均不相同,最好就是对应ITest各个实现类的name
2、定义一个工厂,通过getServiceBeanName方法来来动态的获取泛型对应的具体ITest接口的实现类

代码

抽象实体类 baseInfo

@Data
public abstract class baseInfo{
String getServiceBeanName();
}

继承的实例类

public class TestInfo1 extends baseInfo{
public String getServiceBeanName(){
return "ITestImpl1";
}
}
public class TestInfo2 extends baseInfo{
public String getServiceBeanName(){
return "ITestImpl2";
}
}

定义接口

public interface ITest{
	void test(T t);
}

接口实现类

@Service("ITestImpl1")
public class ITestImpl1 implements ITest{
	void test(TestInfo1 t1){
	//TODO
	}
}
@Service("ITestImpl2")
public class ITestImpl2 implements ITest{
	void test(TestInfo2 t2){
	//TODO
	}
}

工厂类

@Component
public class TestFactory {

    private Map testMap = new HashMap<>();

    @Autowired
    private WebApplicationContext webApplicationContext;

    public ITest getManage(String beanName) {
        return testMap.get(beanName);
    }
    //注意这个注解
    @PostConstruct
    public void register()  {
        Map map = webApplicationContext.getBeansOfType(ITest.class);
        if(map != null && !map.isEmpty()){
            map.entrySet().forEach(entry -> {
                testMap.put(entry.getValue().getServiceBeanName(), entry.getValue());
            });
        }
    }
}

客户端调用

public class Test{
   @Autowired
    private TestFactory  testFactory ;
private void test1(TestInfo1 t1){
ITest itest = testFactory.getManage(t1.getServiceBeanName());
//TODO
}
}

根据代码来认真思考,灵活运用!
欢迎各路大神多多指点小弟

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/672207.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号