一、传统工厂模式
- 定义一个统一的eat接口
public interface FruitService{
public abstract void eat();
}
- 编写一个apple类实现 FruitService
public class AppleServiceImpl implements FruitService{
public void eat(){
System.out.println("Apple");
}
}
- 编写一个orange类实现 FruitService
class OrangeServiceImpl implements FruitService{
public void eat(){
System.out.println("Orange");
}
}
- 编写水果工厂
public class Factory{
public static FruitService getInstance(String fruitName){
FruitService fruit=null;
if("Apple".equals(fruitName)){
fruit = new Apple();
}
if("Orange".equals(fruitName)){
fruit = new Orange();
}
return fruit;
}
}
- 测试
public class hello{
public static void main(String[] args){
FruitService fruit = Factory.getInstance("Orange");
fruit.eat();
}
}
二、增加反射的工厂模式
使用反射主要是为了再后续的扩展中,不需要修改工厂类的代码,否则每次都需要在工厂类中增加一个 if 判断
- 修改工厂类
public class Factory{
public static FruitService getInstance(String ClassName){
FruitService fruit=null;
try{
fruit = (FruitService )Class.forName(ClassName).newInstance();
}catch (Exception e) {
e.printStackTrace();
}
return fruit;
}
}
- 测试
public class hello{
public static void main(String[] args){
FruitService fruit = Factory.getInstance("类名");
if(fruit != null){
fruit.eat();
}
}
}
三、增加枚举的反射工厂模式
其实就是将要传的类名用一个枚举类统一控制,这样一来传参就由之前很繁琐的类名 "com.xx.xx.AppleServiceImpl" 变成了枚举的名称 "APPLE"
- 增加枚举类
public enum FruitEnum {
APPLE("apple","com.xx.AppleServiceImpl"),
ORANGE("orange","com.xx.OrangeServiceImpl");
private String fruitName;
private String className;
FruitEnum(String fruitName, String className) {
this.fruitName = fruitName;
this.className = className;
}
public String getFruitName() {
return fruitName;
}
public String getClassName() {
return className;
}
}
- 测试
public class hello{
public static void main(String[] args){
FruitService fruit = Factory.getInstance(FruitEnum.valueOf("APPLE").getClassName());
if(fruit != null){
fruit.eat();
}
}
}