定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
对于简单工厂模式,我们知道其在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关类。对于客户端来说,这去除了与具体产品的依赖;但于此同时也带来了一个问题:如果我们要增加产品,比如我们要生产苹果计算机,就需要在工厂类中添加一个 Case
分支条件,这违背了开放封闭原则,对修改也开放了。而工厂方法模式就没有违背这个开放封闭原则。如果我们需要生产苹果电脑,则无需修改工厂类,直接创建产品即可。
Product
接口。 Product
类型的对象。 ConcreteProduct
实例。 public abstract class Computer { /** * 产品的抽象方法,由具体的产品类实现 */ public abstract void start(); } 复制代码
Computer
,并实现了父类的 start
方法。 public class LenovoComputer extends Computer { @Override public void start() { System.out.println("联想计算机启动"); } } public class HpComputer extends Computer { @Override public void start() { System.out.println("惠普计算机启动"); } } public class AsusComputer extends Computer { @Override public void start() { System.out.println("华硕计算机启动"); } } 复制代码
createComputer
方法,用于生产各种品牌的计算机。 public abstract class ComputerFactory { public abstract <T extends Computer> T createComputer(Class<T> clz); } 复制代码
public class GDComputerFactory extends ComputerFactory { @Override public <T extends Computer> T createComputer(Class<T> clz) { Computer computer = null; String className = clz.getName(); try { //通过反射来生产不同厂家的计算机 computer = (Computer)Class.forName(className).newInstance(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return (T) computer; } } 复制代码
GDComputerFactory
生产各种计算机。 public class Client { public static void main(String[] args) { ComputerFactory computerFactory = new GDComputerFactory(); LenovoComputer mLenovoComputer = computerFactory.createComputer(LenovoComputer.class); mLenovoComputer.start(); HpComputer mHpComputer = computerFactory.createComputer(HpComputer.class); mHpComputer.start(); AsusComputer mAsusComputer = computerFactory.createComputer(AsusComputer.class); mAsusComputer.start(); } } 复制代码