Java反射机制与工厂模式

工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。

它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象。

简单工厂模式如下:

 1 interface Car {
 2     public void Name();
 3 }
 4 class Audi implements Car {
 5     public void Name() {
 6         System.out.println("Audi");
 7     }
 8 }
 9 class Factory{
10     private Factory() {}
11     public static Car getInstance(String className) {
12         if("Audi".equalsIgnoreCase(className)) {
13             return new Audi();
14         }
15         return null;
16     }
17 }
18 public class Test {
19     public static void main(String[] args) throws Exception {
20         Car audi = Factory.getInstance("Audi");
21         audi.Name();
22     }
23 }
简单工厂模式

 

问题在于,可能会有很多的继承接口的子类,那么工厂类就要一直更新下去,很麻烦。这时候,就引入反射机制。

 1 package test;
 2 interface Car {
 3     public void Name();
 4 }
 5 class Audi implements Car {
 6     public void Name() {
 7         System.out.println("Audi");
 8     }
 9 }
10 class Factory {
11     private Factory() {}
12     public static Car getInstance(String className) {
13         Car instance = null;
14         try {
15             instance = (Car) Class.forName(className).getDeclaredConstructor().newInstance();
16         } catch (Exception e) {
17             e.printStackTrace();
18         }
19         return instance;
20     }
21 }
22 public class Test {
23     public static void main(String[] args) throws Exception {
24         Car msg = Factory.getInstance("test.Audi");
25         msg.Name();
26     }
27 }
工厂模式

 

关于反射
反射最大的作用之一就在于可以不在编译时知道某个对象的类型,而在运行时通过提供完整的”包名+类名.class”得到。注意:不是在编译时,而是在运行时。
功能:
•在运行时能判断任意一个对象所属的类。
•在运行时能构造任意一个类的对象。
•在运行时判断任意一个类所具有的成员变量和方法。
•在运行时调用任意一个对象的方法。
说大白话就是,利用Java反射机制我们可以加载一个运行时才得知名称的class,获悉其构造方法,并生成其对象实体,能对其fields设值并唤起其methods。
应用场景:
反射技术常用在各类通用框架开发中。因为为了保证框架的通用性,需要根据配置文件加载不同的对象或类,并调用不同的方法,这个时候就会用到反射——运行时动态加载需要加载的对象。
特点:
由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。

 

最后,如果接口也特别多的话,工厂类里还是要写很多个方法,这个问题可以用泛型解决,这样的工厂模式叫抽象工厂模式

 1 package test;
 2 interface Car {
 3     public void Name();
 4 }
 5 class Audi implements Car {
 6     public void Name() {
 7         System.out.println("Audi");
 8     }
 9 }
10 interface Phone{
11     public void Name();
12 }
13 class iPhone implements Phone{
14     public void Name() {
15         System.out.println("iPhone");
16     }
17 }
18 class Factory {
19     private Factory() {}
20 
21     @SuppressWarnings("unchecked")
22     //instanceName 接口的子类   className接口的类型
23     public static <T> T getInstance(String instanceName, Class<T> className ) {
24         T instance = null;
25         try {
26             instance = (T) Class.forName(instanceName).getDeclaredConstructor().newInstance();
27         } catch (Exception e) {
28             e.printStackTrace();
29         }
30         return instance;
31     }
32 }
33 public class Test {
34     public static void main(String[] args) throws Exception {
35         Car audi = Factory.getInstance("test.Audi", Car.class);
36         audi.Name();
37         iPhone iphonex = Factory.getInstance("test.iPhone", iPhone.class);
38         iphonex.Name();
39     }
40 }
抽象工厂模式

 面试题:什么是java反射机制?

反射机制是 Java 语言提供的一种基础功能,赋予程序在时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个

对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。

posted @ 2019-02-19 18:56  feifei97  阅读(875)  评论(0编辑  收藏  举报