定义一个用于创建对象的接口, 让子类决定实例化哪个类. 工厂方法使一个类的实例化延迟到其子类.
工厂方法与简单工厂
对于简单工厂模式, 我们知道其在工厂类中包含了必要的逻辑判断, 根据不同的条件来动态实例化相关类. 对于客户端来说, 这去除了与具体产品的依赖; 但于此同时也带来了一个问题: 如果我们要增加产品, 比如我们要生产苹果计算机, 就需要在工厂类中添加一个 Case 分支条件, 这违背了开放封闭原则, 对修改也开放了. 而工厂方法模式就没有违背这个开放封闭原则. 如果我们需要生产苹果电脑, 则无需修改工厂类, 直接创建产品即可.
角色
Product: 抽象产品类.
ConcreteProduct: 具体产品类, 实现 Product 接口.
Factory: 抽象工厂类, 该方法返回一个 Product 类型的对象.
ConcreteFactory: 具体工厂类, 返回 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();
- }
- }
来源: https://juejin.im/post/5beab5eff265da616b104064