一、原理
反射机制的原理
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
工厂模式自述
所谓工厂模式,是说由某个产品类接口、产品实现类、工厂类、客户端(单元测试主类)构成的一个模式,大程度的降低了代码的耦合性。能够在创建新产品新功能时候,不去触碰原有的逻辑。同时不会对客户端暴露创建逻辑。这篇文章用理发来解释工厂模式的应用。
二 、工厂模式的应用
先写产品接口
1public interface Hair { 2 3 /** 4 * design hair cutting 5 */ 6 void draw(); 7}
这部分没有什么好说的 ,和平时的service层一样。创建接口,新建接口方法。 再写产品接口的实现类。 先假设,理发店里有左偏分发型 。
1public class LeftHairImpl implements Hair { 2 @Override 3 public void draw() { 4 System.out.println("-----左偏分-----"); 5 } 6}
在实现类里实现了左偏分发型的创建。假如,不使用工厂模式,那么 ,客户端应该是这样的。
1public class HairCutTest { 2 public static void main(String[]args){ 3 HairInterface left = new LeftHair(); 4 left.draw(); 5 } 6}
结果是这样的。
这样我们在客户端里暴露了我们创建发型的实现逻辑,不利于代码的维护。并且,每次有新的发型,还需要新建Hair,比如我们新建一个右偏分,就要在客户端里新建一个右偏分对象RightHair。
如果,引入了工厂模式
1public class HairFactory { 2 public HairInterface getHair(String key){ 3 if("left".equals(key)){ 4 return new LeftHair(); 5 }else if("right".equals(key)){ 6 return new RightHair(); 7 } 8 return null; 9 } 10}
那么,客户端应该是这样的。
1public class HairCutTest { 2 public static void main(String[] args){ 3 HairFactory factory = new HairFactory(); 4 HairInterface left = factory.getHair("left"); 5 left.draw(); 6 } 7}
运行结果还是一样的。
真不错!!!但是安装了 阿里巴巴开发编程规范,一直提醒这魔法值,太难受了奥。而且,每多一种发型,就得写一个else if,头秃!
1魔法值:编程规范里提到说是莫名其妙出现的一个值。
改进下,用反射机制写。
1public class HairFactory { 2 public Hair getHairByClassKey(String className){ 3 try{ 4 return (Hair)Class.forName(className).newInstance(); 5 } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) { 6 e.printStackTrace(); 7 } 8 return null; 9 } 10}
这里有简写代码。完整的应该这样:
1try { 2 Hair hair = (Hair)Class.forName(className).newInstance(); 3 return hair; 4 }
在客户端应该是这样的。
1public class HairCutTest { 2 public static void main(String[]args){ 3 HairFactory factory = new HairFactory(); 4 Hair left = factory.getHairByClassKey("com.factoriespartten.hair.impl.LeftHairImpl"); 5 left.draw(); 6 } 7}
运行结果是一样的。真香 !

