从工厂方法到注解的小例子

简介: 这里的前几个过程就不符代码了,请读者自行补充;只附上第四版,通过注解替换工厂方法实现自动化的小例子

一、背景介绍


上篇"自定义注解和注解解析器",通过小例子介绍了自定义注解的运用;本篇继续基于小例子来实现工厂方法,以及注解实现工厂方法


二、思路&方案


  • 1.米老师依赖何老师;强耦合的依赖关系图


  • 2.米老师依赖何老师;通过Class实现弱耦合的依赖关系图


  • 3.米老师依赖何老师;通过工厂方法实现自动化的弱耦合的依赖关系图


  • 4.米老师依赖何老师;通过注解替换工厂方法实现自动化的弱耦合的依赖关系图


三、过程


这里的前几个过程就不符代码了,请读者自行补充;只附上第四版,通过注解替换工厂方法实现自动化的小例子


过程图一


19dd4459936b4d0094a36b56f3a21d67.png


过程图二


3fb3570f31a54bfe8a621481ae0eed62.png


过程图三


0a87c969ca3341268e6174c037ffb68a.png


过程图四(运行时的图)


82d434cc813d4e9f82d22367d288641c.png


代码


package oldMark7_Anotation_v1;
/**
 * 1.每个类调用的时候,通过判断注解来进行反射对象
 *
 * 2.注解中的参数,可以通过配置文件获取(注解中的参数,可以当做类的一个属性,然后获取配置文件中的值)
 */
public class Client {
    public static void main(String[] args){
        Notice notice = new Notice();
        notice.send();
    }
}


package oldMark7_Anotation_v1;
public abstract class Executant {
    public String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public abstract void OpenDoor(Executant executant);
}


package oldMark7_Anotation_v1;
public class Helaoshi extends Executant {
    public Helaoshi(String name) {
        this.name = name;
    }
    public Helaoshi(){}
    public void OpenDoor(Executant executant){
        this.privateOpenDoor(executant);
    }
    private void  privateOpenDoor(Executant executant){
        System.out.println("我是"+this.name+",我去开门了!");
    }
}


package oldMark7_Anotation_v1;
public class Milaoshi extends Executant {
    public Milaoshi(String name) {
        this.name = name;
    }
    public Milaoshi(){}
    private void privateOpenDoor(Executant executant){
        System.out.println(this.name+"调用"+executant.getName()+"开门的方法");
        executant.OpenDoor(executant);
    }
    public void OpenDoor(Executant executant){
        this.privateOpenDoor(executant);
    }
}


package oldMark7_Anotation_v1;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyResource {
    String packageName();
}


package oldMark7_Anotation_v1;
import java.lang.reflect.Field;
public class MyResourceExplanationFactoryImpl {
    public static void createBean(Object object){
        createBeanPrivate(object);
    }
    private static void createBeanPrivate(Object object){
        try {
            //1.获取传进来的对象的类模板
            Class<?> clazzObj = object.getClass();
            Field[] fields = clazzObj.getFields();
            for (Field field:fields) {
                if(field.isAnnotationPresent(MyResource.class)){
                    String packageName = field.getAnnotation(MyResource.class).packageName();
                    Class<?> clazz = Class.forName(packageName);
                    Executant executant = (Executant)clazz.newInstance();
                    field.setAccessible(true);
                    field.set(object, executant);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}


package oldMark7_Anotation_v1;
//ui意识、无限思维-面向对象
public class Notice {
    //将packageName这个参数进行io传递(提示是否要传递,自动延时XX秒,提示是否需要修改配置文件;)良好的interface friend设计
    @MyResource(packageName = "oldMark7_Anotation_v1.Milaoshi")
    public Executant milaoshi ;
    @MyResource(packageName = "oldMark7_Anotation_v1.Helaoshi")
    public Executant helaoshi;
    public void send(){
        this.privateSend();
    }
    private void privateSend(){
        MyResourceExplanationFactoryImpl.createBean(this);
        milaoshi.setName("米老师");
        System.out.println(milaoshi.hashCode());
        System.out.println(milaoshi.toString());
        helaoshi.setName("何老师");
        milaoshi.OpenDoor(helaoshi);
    }
}


四、总结


  • 1.通过一步步的变化更加认识到变化规律的重要性,使其显得行云流水


  • 2.图对代码,代码配合图的方式强化了宏观


  • 3.图中的布局,也是一种宏观的彰显


  • 4.通过刻意练习来刻画自身通过规律提升想象力的能力


五、升华


本次变化摸索其中的规律,以及结合需求达到每一次变的效果,通过这样的训练可以达到知晓过去通晓未来的神奇。

相关文章
|
关系型数据库 MySQL Shell
MySQL高可用之双主+Keepalived,轻松实现单点故障VIP转移
MySQL高可用之双主+Keepalived,轻松实现单点故障VIP转移
2916 0
MySQL高可用之双主+Keepalived,轻松实现单点故障VIP转移
|
9月前
|
机器学习/深度学习 弹性计算 人工智能
2026年阿里云服务器租用价格:轻量应用服务器与云服务器ECS活动价格明细
2026年阿里云活动内云服务器覆盖轻量应用、经济型、通用算力型及第九代企业级实例等多类配置。轻量应用服务器低至38元/年(2核2G+200M带宽),经济型e实例99元/年起(2核2G+3M带宽),通用算力型u1实例199元/年起(2核4G+5M带宽)。第九代实例搭载高性能处理器,性能提升20%,适配AI、大数据等场景。以下是具体活动价格明细。
|
JSON 自然语言处理 数据格式
Tauri 开发实践 — Tauri 自定义多语言菜单开发
本文介绍了如何在 Tauri 应用中实现自定义菜单并支持多语言。首先,通过 `Translator` 类加载和解析多语言 JSON 文件,实现简单的翻译功能。接着,创建包含文件、编辑和窗口子菜单的基本菜单结构,并根据当前语言进行翻译。最后,在主函数中读取语言设置,创建菜单并处理菜单事件,确保应用的国际化和用户体验。源码可在 GitHub 上查看。
1025 2
Flutter MAC VSCode 常用快捷键和命令行
Flutter MAC VSCode 常用快捷键和命令行
609 0
|
SQL 数据库
数据审计 -本福德定律 Benford‘s law (sample database classicmodels _No.6)
数据审计 -本福德定律 Benford‘s law (sample database classicmodels _No.6)
777 1
|
传感器 监控 安全
物联网:NB卡的应用场景
物联网NB-IoT(窄带物联网)卡作为一种低功耗、广覆盖、大连接的物联网通信技术,广泛应用于各种需要远程监控、数据传输和智能管理的场景中。以下是一些NB-IoT卡的具体应用场景及其操作概述:
|
算法 JavaScript 前端开发
Web Audio API 第4章 音调与频域
Web Audio API 第4章 音调与频域
|
机器学习/深度学习 人工智能 算法
【坚果识别】果实识别+图像识别系统+Python+计算机课设+人工智能课设+卷积算法
坚果识别系统,使用Python语言进行开发,通过TensorFlow搭建卷积神经网络算法模型,对10种坚果果实('杏仁', '巴西坚果', '腰果', '椰子', '榛子', '夏威夷果', '山核桃', '松子', '开心果', '核桃')等图片数据集进行训练,得到一个识别精度较高的模型文件,让后使用Django搭建Web网页端界面操作平台,实现用户上传一张坚果图片 识别其名称。
536 0
|
开发框架 搜索推荐 安全
到底什么是伪静态?为什么要做伪静态?
到底什么是伪静态?为什么要做伪静态?
925 0
|
SQL 数据可视化 Java
分享三个java低代码开发平台,每个都很能打,建议收藏
来讲讲近期比较流行的低代码开发平台一词。低代码的目的是将可重复性的编程工作通过平台实现,将开发人员从没有技术含量的增删改查开发中解放出来,让其专注于更有价值的开发工作,例如业务建模、数据库设计、流程设计、API核心开发、业务逻辑开发等工作。
分享三个java低代码开发平台,每个都很能打,建议收藏

热门文章

最新文章