Java 工厂模式与反射结合,使你的代码更加优雅

一、传统工厂模式

  1. 定义一个统一的eat接口
public interface FruitService{
          
   
    public abstract void eat();
}
  1. 编写一个apple类实现 FruitService
public class AppleServiceImpl implements FruitService{
          
   
     public void eat(){
          
   
         System.out.println("Apple");
     }
}
  1. 编写一个orange类实现 FruitService
class OrangeServiceImpl implements FruitService{
          
   
     public void eat(){
          
   
         System.out.println("Orange");
     }
}
  1. 编写水果工厂
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;
     }
}
  1. 测试
public class hello{
          
   
     public static void main(String[] args){
          
   
         FruitService fruit = Factory.getInstance("Orange");
         fruit.eat();
     }
}

二、增加反射的工厂模式

使用反射主要是为了再后续的扩展中,不需要修改工厂类的代码,否则每次都需要在工厂类中增加一个 if 判断

  1. 修改工厂类
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;
     }
}
  1. 测试
public class hello{
          
   
     public static void main(String[] args){
          
   
         FruitService fruit = Factory.getInstance("类名");
         if(fruit != null){
          
   
            fruit.eat();
        }
     }
}

三、增加枚举的反射工厂模式

其实就是将要传的类名用一个枚举类统一控制,这样一来传参就由之前很繁琐的类名 "com.xx.xx.AppleServiceImpl" 变成了枚举的名称 "APPLE"

  1. 增加枚举类
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;
    }
}
  1. 测试
public class hello{
          
   
     public static void main(String[] args){
          
   
         FruitService fruit = Factory.getInstance(FruitEnum.valueOf("APPLE").getClassName());
         if(fruit != null){
          
   
            fruit.eat();
        }
     }
}
经验分享 程序员 微信小程序 职场和发展