工厂方法模式
当类的初始化逻辑比较复杂时,初始化代码就不能全部都放在构造函数里面了,这样势必会导致在调用构造函数前后有初始化代码。这样,Factory类的创建方法中的分支里就不止实例化代码,还有初始化代码。这时,简单工厂模式中的反射技术就失效了,进而用简单工厂模式来处理这样的情况,就不能实现开闭原则了。针对这种情况,首先把原先简单工厂模式中的Factory类升级为Factory接口,然后将原来Factory类的创建方法中各个分支中的初始化代码和实例化代码抽取到相应的Factory接口实现类的创建方法中。这样,if-else分支被挪移到Client类中去了,各个分支就是相应工厂实现类的实例化以及调用创建方法的逻辑,进而通过参数化Factory实现类和反射技术消除if-else,进而实现了开闭原则,即在配置文件中加入新Factory的配置,无需修改任何代码。
Product接口
package com.life.factory; public interface Computer { void start(); }
Product实现类
package com.life.factory; public class DellComputer implements Computer { public DellComputer() { System.out.println("DellComputer实例化了"); } public void start() { System.out.println("欢迎使用戴尔电脑"); } }
Factory接口
package com.life.factory; public interface ComputerFactory { Computer createComputer(); }
Factory实现类
package com.life.factory; public class DellComputerFactory implements ComputerFactory { @Override public Computer createComputer() { System.out.println("在实例化DellComputer前的一些逻辑"); DellComputer dellComputer = new DellComputer(); System.out.println("在实例化DellComputer后的一些逻辑"); return dellComputer; } }
Client类
package com.life.factory; import com.life.Util; public class Client { public static void main(String[] args) { String type = "dellFactory"; ComputerFactory factory = (ComputerFactory) Util.getBean(type); Computer computer = factory.createComputer(); computer.start(); } }