通过注解反射扫描方式实现工厂模式

  最近在研读java设计模式,看到其工厂模式实现类,通过switch case 不同的类型返回不同的处理方式类(这种写法每次新增一个工厂类都要修改case),突然萌生一个想法,能不能通过注解的方式来这个方式,以下就是我来实现的demo,有什么问题大家可以留言指出。


依赖jar
<!-- https://mvnrepository.com/artifact/org.reflections/reflections -->
<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.11</version>
</dependency>
自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface TestAnnotat {
    String des() default "用于测试";
}
多个处理类实现
public interface FunHandler {
    void handle(String name);
}

@TestAnnotat(des = "数据测试")
public class DataHandler implements FunHandler {
    public void handle(String name){
        System.out.println("数据 name = " + name);
    }
}

@TestAnnotat(des = "消息测试")
public class MsgHandler implements FunHandler {
    public void handle(String name){
        System.out.println("消息 name = " + name);
    }
}

注:需要扫描的处理类都放在一个包下,方便扫描

反射扫描各实现方法
String pkg = FunHandler.class.getPackage().getName();  // 获取需要扫描的包名
System.out.println("pkg = " + pkg);
Reflections f = new Reflections(pkg);
Set<Class<?>> set = f.getTypesAnnotatedWith(TestAnnotat.class);
for (Class<?> c : set) {
     Object bean = c.newInstance();
     TestAnnotat annotation = c.getAnnotation(TestAnnotat.class);
     System.out.println("annotation.des() = " + annotation.des());
     FunHandler funHandler = (FunHandler)bean;
     funHandler.handle("test");
}

参考资料:http://c.biancheng.net/design_pattern/

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容