interfaceFruitFactory { // 工厂中获取水果实例的方法 Fruit getFruit(); // 这两个静态方法将获取对应工厂并通过其来获取 Fruit,这里使用了模板模式 // 实际使用中不应当让用户输入全类名,可以像 spring 中的 xml 配置那样给类名绑定一个 id static Fruit getFruit(String factoryName) { if (factoryName == null || factoryName.length() == 0) { thrownewIllegalArgumentException("需给定有效字符串!"); } try { Class<?> factoryClass = Class.forName(factoryName); // 获取工厂时可以使用单例模式! // 这里没有加入错误检查 return getFruit((Class<? extendsFruitFactory>) factoryClass); } catch (Exception e) { e.printStackTrace(); returnnull; } } static Fruit getFruit(Class<? extends FruitFactory> factoryClass) { try { return factoryClass.getDeclaredConstructor().newInstance().getFruit(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); returnnull; } } } classAppleFactoryimplementsFruitFactory { @Override public Fruit getFruit() { // 一些处理。.. returnnewApple(); } } classBananaFactoryimplementsFruitFactory { @Override public Fruit getFruit() { // 一些处理。.. returnnewBanana(); } } // . . . publicclassMain { publicstaticvoidmain(String[] args)throws InterruptedException, ClassNotFoundException { FruitFactory.getFruit(AppleFactory.class).whoAmI(); } }
工厂方法模式可以与各种设计模式组合使用,最有价值的几个组合是和单例模式,原型模式,代理模式……技术上对工厂方法模式的发展和改进是持续进行的,目前最经典和最有实践价值的实现是 Spring 的核心容器,它不仅负责管理各个产品(称为 bean),也能管理各个产品之间的相互依赖,用户能够完全不用关心代码的具体实现。这种抽象性虽然让系统更加难以理解,但对工程实践是极为方便的。