对象接口
package designMode.factory;
public interface Fruit {
void eat();
}
对象实现
package designMode.factory;
public class Apple implements Fruit{
private String color="";
public Apple() {
}
public Apple(String color) {
this.color = color;
}
@Override
public void eat() {
System.out.println("eat a apple");
}
}
package designMode.factory;
public class Orange implements Fruit{
private String color="";
public Orange() {
}
public Orange(String color) {
this.color = color;
}
@Override
public void eat() {
System.out.println("eat a orange");
}
}
反射实现的工厂模式
无输入参数方式
public static Fruit getFruit(Class<? extends Fruit> clazz) {
try {
return (Fruit) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//通用方式
public static <T> T getInstance(Class<? extends T> clazz) {
try {
return (T) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
有输入参数方式
public static Fruit getFruitWithColor(Class<? extends Fruit> clazz,String color) {
try {
return (Fruit) Class.forName(clazz.getName()).getConstructor(String.class).newInstance(color);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//通用方式
public static <T> T getInstanceWithParams(Class<? extends T> clazz,Class[] parameterTypes,Object[] parameters) {
try {
return (T) Class.forName(clazz.getName()).getConstructor(parameterTypes).newInstance(parameters);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//使用
public static void main(String[] args) {
Fruit apple = getInstanceWithParams(Apple.class, new Class[]{String.class}, new Object[]{"red"});
Fruit orange = getInstanceWithParams(Orange.class, new Class[]{String.class}, new Object[]{"red"});
apple.eat();
orange.eat();
}
Reflections包扫描的工厂模式(使用注解)
package designMode.factory;
public interface Fruit {
void eat();
}
package designMode.factory;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface FruitAnno {
String value();
}
package designMode.factory;
@FruitAnno("apple")
public class Apple implements Fruit{
private String color="";
public Apple() {
}
public Apple(String color) {
this.color = color;
}
@Override
public void eat() {
System.out.println("eat a apple");
}
}
package designMode.factory;
@FruitAnno("orange")
public class Orange implements Fruit{
private String color="";
public Orange() {
}
public Orange(String color) {
this.color = color;
}
@Override
public void eat() {
System.out.println("eat a orange");
}
}
工厂类
package designMode.factory;
import org.reflections.Reflections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class ReflectionsFruitFactory {
//获得名称与类的对应表
public static Map<String, Class<?>> getNameToClassMap() {
Map<String, Class<?>> classMap = new HashMap<>();
try {
Reflections reflections = new Reflections("designMode.factory");
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(FruitAnno.class);
for (Class<?> aClass : classes) {
FruitAnno fruitAnno = aClass.getAnnotation(FruitAnno.class);
classMap.put(fruitAnno.value(), aClass);
}
} catch (Exception e) {
e.printStackTrace();
}
return classMap;
}
//使用
public static void main(String[] args) throws Exception {
Map<String, Class<?>> fruitMap = getNameToClassMap();
Class<?> appleClass = fruitMap.get("apple");
Apple apple = (Apple) appleClass.getConstructor().newInstance();
apple.eat();
}
}