基于反射工厂的案例演示:
package entity;
/**
* 抽象动物类
* @author tonysong
*
*/
public abstract class Animale {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 带参构造
* @param name
*/
public Animale(String name) {
super();
this.name = name;
}
//抽象的叫
public abstract void shout();
}
package entity;
/**
* 猫类继承动物
* @author tonysong
*
*/
public class Cat extends Animale{
/**
* 带参构造
* @param name
*/
public Cat(String name) {
super(name);
}
@Override
public void shout() {
//重写父类的抽象方法
System.out.printf("我叫%s,喵喵",this.getName());
}
}
package entity;
/**
* 狗类
* @author tonysong
*
*/
public class Dog extends Animale{
public Dog(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void shout() {
System.out.printf("我叫%s,汪汪",this.getName());
}
}
package factory;
import java.lang.reflect.InvocationTargetException;
import entity.Animale;
import entity.Cat;
import entity.Dog;
/**
* 动物工厂
* @author tonysong
*
*/
public class Factory {
/**
* 反射工厂
* @param className
* @param name
* @return
*/
public static Animale createAnimale(String className,String name){
Animale an=null;
try {
//通过字符串得到类型
Class<?> c=Class.forName(className);
//通过带参构造得到对象
Object obj= c.getDeclaredConstructor(String.class).newInstance(name);
//类型判断
if(obj instanceof Animale)
an=(Animale)obj;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return an;
}
/**
* 简单工厂
* @param num
* @param name
* @return
*/
public static Animale createAnimale(int num,String name){
Animale an=null;
switch(num){
case 1: an=new Dog(name); break;
case 2: an=new Cat(name); break;
}
return an;
}
}
package test;
import entity.Animale;
import entity.Cat;
import entity.Dog;
import factory.Factory;
/**
* 测试类
* @author tonysong
*
*/
public class Test {
public static void main(String[] args) {
Animale an=Factory.createAnimale("entity.Cat", "小白");
an.shout();
}
}