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

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

一、背景介绍


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


二、思路&方案


  • 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.通过刻意练习来刻画自身通过规律提升想象力的能力


五、升华


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

相关文章
|
传感器 边缘计算 物联网
物联网架构体系(一)
物联网架构体系(一)
3997 21
|
存储 安全 算法
【JAVA】HashMap扩容性能影响及优化策略
【JAVA】HashMap扩容性能影响及优化策略
|
弹性计算 固态存储 大数据
2024阿里云服务器租用价格表(一年/按月/按小时报价明细)
阿里云服务器2024年最新租用价格表显示,轻量应用服务器2核2G3M带宽一年82元(约6.8元/月),2核4G4M带宽轻量服务器一年298元。新老用户共享99元一年的2核2G3M带宽ECS经济型e实例服务器与199元一年的企业专享2核4G5M带宽ECS u1实例服务器优惠。4核16G10M带宽游戏服务器70元/月,8核32G10M带宽160元/月。GPU服务器如gn6v和gn6i等提供新用户专享折扣。续费折扣方面,续费一年享有7.5折,续费五年则有3折优惠。按小时计费的云服务器ECS实例中,如ecs.u1-c1m4.large(2核8G)每小时0.45元。
30841 17
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
1597 3
|
XML 开发框架 API
【Qt 学习笔记】QWidget的windowTitle属性 | windowIcon属性 | qrc文件机制
【Qt 学习笔记】QWidget的windowTitle属性 | windowIcon属性 | qrc文件机制
883 1
|
程序员 图形学
ThreeJs模拟工厂生产过程五
这篇文章详细介绍了如何在Three.js中模拟工业生产过程的第五部分,重点在于添加并实现车间内人物的动态行走动画,使人能够在车间内来回移动,增加了场景的真实感。
205 0
【单片机】简易计算器完整代码带电路图
【单片机】简易计算器完整代码带电路图
966 0
【单片机】简易计算器完整代码带电路图
|
机器学习/深度学习 数据可视化 计算机视觉
【YOLOv8改进】MCA:用于图像识别的深度卷积神经网络中的多维协作注意力 (论文笔记+引入代码)
YOLO目标检测专栏介绍了YOLO的创新改进和实战案例,包括多维协作注意力(MCA)机制,它通过三分支架构同时处理通道、高度和宽度注意力,提高CNN性能。MCA设计了自适应组合和门控机制,增强特征表示,且保持轻量化。该模块适用于各种CNN,实验证明其在图像识别任务上的优越性。此外,文章还展示了如何在YOLOv8中引入MCA层的代码实现和相关任务配置。
|
Ubuntu 安全 测试技术
Ubuntu 22.04 Samba 安装和配置
SMB(Server Message Block)是一种跨平台的文件共享协议,它允许不同操作系统之间的文件和打印机共享。在本文中,我们将详细介绍如何在 Ubuntu 服务器上部署和配置一个 SMB 服务器,并涵盖多通道配置、性能测试、安全最佳实践以及一些常见问题。【8月更文挑战第1天】
2462 1
|
JavaScript 前端开发 算法
JavaScript 中前置自增与后置自增:区别、应用场景
【4月更文挑战第6天】JavaScript中的前置自增`++a`先增后用,返回新值,适合复合赋值和循环计数;后置自增`a++`先用后增,返回原值,适用于保留变量原值的操作。二者差异在于运算时机和返回值,选择时要考虑递增时机和表达式中使用的值。在复杂表达式中应避免混用,注重代码清晰度和一致性。理解这些差异能提高代码效率,避免逻辑错误。
848 1