从工厂模式到IoC控制反转

从工厂模式到IoC控制反转,第1张

今天假期xin麒继续卷。

​ 唉,每当一个人偷偷卷时,总是会默默落泪,哪个富婆又能看穿麒麒内心得脆弱,走进麒麒柔弱的心房,及时给予麒麒最及时的温柔呢?

来一波工厂模式到IoC(全称inversion of control)实现思路的简单分析:

一、前提引入:
  • 有A类和B类,xin麒想在B类中一个方法实现A类的调用,应该如何实现才更好呢?
二、实现

从历史演变的过程应该是这样子的:

1、最初始的思路:

​ 首先在两个java分别定义A类和B类,B类直接在那个方法中创建并且调用A类方法。

实现以上思路:

public class A {
    public void aMethod(){
        System.out.println("the method named \"aMethod\" in" +
                " the class of A had been use");

    }
}
public class B {
    public static void main(String[] args) {
        bMethod();
    }
    public static void bMethod(){
        A a = new A();
        a.aMethod();
    }
}

运行:

2、工厂模式:

B类方法不再是独自地实现调用A类的方法了,因为B类方法中经过了富婆C类的帮助:

​ 就是C类的一个静态方法实现A类的创建,曾经孤单的B类方法经过富婆C的帮助实现A类的创建。

实现思路:

public class A {
    public void aMethod(){
        System.out.println("the method named \"aMethod\" in" +
                " the class of A had been use");

    }
}
public class C {
    public static A GetAClass(){
        return new A();

    }
}

public class B {
    public static void main(String[] args) {
        bMethodHelpedByC();
    }
    public static void bMethodHelpedByC(){
        A a = C.GetAClass();
        a.aMethod();
    }
}

运行:

三、IoC

实际上,是使用到了反射+工厂模式的思路:

代码文件路径:

具体实现:

public class A {
    public void aMethod(){
        System.out.println("the method named \"aMethod\" in" +
                " the class of A had been use");
    }
}
public class C {
    public static A GetAClassByreflex() throws Exception {
        Class<?> aClass = Class.forName("com.lws.personaltest.FactoryPattern.A");
        return (A)aClass.newInstance();
    }
}

public class B {
    public static void main(String[] args) throws Exception {
        bMethodHelpedByC2();
    }
    public static void bMethodHelpedByC2() throws Exception {
        A a = C.GetAClassByreflex();
        a.aMethod();
    }
}

运行:

外加一个配置文件,如果回到java基础,我们可以使用properties文件,当然,在java项目中可能会使用其他的配置文件.这里xin麒还记得properties,那就使用properties来演示吧。

主要思路:

  • 在properties文件编写A类的路径;
  • 通过输入流load到properties对象;
  • C类的静态方法通过properties对象获取A类的路径的String型变量;
        • 通过Class.forName()反射获取class类对象的变量aClass
  • 通过变量aClass创建一个实例对象返回。

文件路径介绍:

具体实现:

public class A {
    public void aMethod(){
        System.out.println("the method named \"aMethod\" in" +
                " the class of A had been use");
    }
}
public class C {
    public static A GetAClassByreflexAndProperties() throws Exception {
        FileInputStream fileInputStream = new FileInputStream("src\NameOfClassA.properties");
        Properties properties = new Properties();
        properties.load(fileInputStream);
        String strClassA = properties.get("ClassA").toString();
        Class<?> aClass = Class.forName(strClassA);
        return (A)aClass.newInstance();
    }
}

public class B {
    public static void main(String[] args) throws Exception {
        bMethodHelpedByC3();
    }
    public static void bMethodHelpedByC3() throws Exception {
        System.out.println("通过了GetAClassByreflexAndProperties 方法");
        A a = C.GetAClassByreflexAndProperties();
        a.aMethod();
    }
}

运行:

xin麒如有不足,希望大家指正!!!
end.

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/795722.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存