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();
        }
     }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值