使用反射机制的情况
摘自:
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中就不用跟着添加代码啦!
谢谢!