今天假期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.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)