Java 工厂模式与反射结合,使你的代码更加优雅
一、传统工厂模式
- 定义一个统一的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(); } } }
下一篇:
数据结构顺序表C语言实现