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