使用反射机制的情况

摘自:

https://www.zhihu.com/question/24304289/answer/147529485

 

反射机制具有更高的灵活性。

一、前提描述:

假设在工厂模式下。有接口以及实现如下:

(1)接口

1 package reflectlearn;
2 
3 public interface Fish {
4     void myCategory();
5 }

(2)实现:

1 package reflectlearn;
2 
3 public class Shark implements Fish {
4     @Override
5     public void myCategory(){
6         System.out.println("I am a shark");
7     }
8 }

(3)工厂:

 1 package reflectlearn;
 2 
 3 public class FishFactory {
 4     public static Fish getInstance(String fn) {
 5         if ("Shark".equals(fn)) return new Shark();
 6         return null;
 7     }
 8 

此时,如果我们继续实现FIsh的时候,则在FishFactory中要继续添加代码。不够灵活。

 

二、反射机制:

反射机制,可以对原来的类进行任意操作。增加实现,并且修改FishFactory类。

(1)接口

1 package reflectlearn;
2 
3 public interface Fish {
4     void myCategory();
5 }

(2)实现:

1 package reflectlearn;
2 
3 public class Shark implements Fish {
4     @Override
5     public void myCategory(){
6         System.out.println("I am a shark");
7     }
8 }
1 package reflectlearn;
2 
3 public class Tuna implements Fish{
4     @Override
5     public void myCategory(){
6         System.out.println("I am a tuna");
7     }
8 }
1 package reflectlearn;
2 
3 public class Whale implements Fish {
4     @Override
5     public void myCategory(){
6         System.out.println("I am a whale");
7     }
8 }

(3)工厂

 1 package reflectlearn;
 2 
 3 public class FishFactory {
 4     public static Fish getInstance(String fn) {
 5         Fish f = null;
 6         try {
 7             //先通过Class.forName()得到Class, 在通过newInstance得到实例。
 8             f = (Fish) Class.forName(fn).newInstance();
 9         } catch (Exception e) {
10             e.printStackTrace();
11         }
12         return f;
13     }
14 
15 }

 

每添加一个实现的时候,这样在FishFactory中就不用跟着添加代码啦!

posted @ 2019-01-06 11:39  ylxn  阅读(165)  评论(0编辑  收藏  举报