秒懂设计模式之工厂方法模式(Factory Method Pattern)

前言

人在IT江湖飘,不懂设计模式咋装X?

今天让我们一起来研究一下三种工厂模式,其均为创建型模式,即讨论的是如何创建一个类的对象的问题。就是以各种高逼格的方式最终将一个类的对象new出来,一点也不神秘。如果你发现需要一个类的对象而你又不会这些装X神器,那你就直接new好啦,爱谁谁。。。不过你也就逃脱不永远是个小白的命运啦,过几年混不下去了就只能去卖奶茶,什么?你不想那么快就去卖奶茶,那就好好学习这些装X神器!

定义

来小朋友们,让我们干了定义这杯苦酒吧:

Define an interface for creating an object, but let subclasses decide which class to instantiate. The Factory method lets a class defer instantiation it uses to subclasses.
定义一个用于创建对象的接口,让子类决定实例化哪个类

使用场景

最重要的知识点,这是最重要的知识点,这是最重要的知识点!

首先当然是在你需要new一个类的对象的时候,此时各种状况出现啦:

  1. 你不想直接new这个类的对象,怕以后这个类改变的时候你需要回来改代码,而此时依赖这个类的地方已经到处都是了。
  2. 这个类的对象构建过程非常复杂,你不愿意将这么复杂的构建过程一遍又一遍的写在需要用到此对象的地方。
  3. 这个类的对象在构建过程中依赖了很多其他的类,而你无法在调用的地方提供。

工厂方法模式是简单工厂方法模式的升级版本,为了克服简单工厂方法模式的缺点而生,作用和简单工厂方法完全一样。

如何实现

工厂方法模式为每一种产品生成一个对应的工厂,从而替换掉简单工厂方法模式中那个静态工厂方法。

业务场景

假设我们现在要生产多种牌子的笔记本电脑,例如要生产小米笔记本电脑和苹果笔记本电脑,那我们如何用代码实现这个业务呢?

使用工厂方法模式

工厂方法模式的核心思想:讨论的仍然是如何构建同一类型产品(都实现同一个接口)的问题,只不过是通过为每一种要生产的产品配备一个工厂,就是说每个工厂只生产一种特定的产品。这样做的好处就是当以后需要增加新的产品时,直接新增加一个对应的工厂就可以了,而不是去修改原有的工厂。下面我们看下具体代码:

第一步:定义一个电脑的抽象基类,里面有一个为电脑安装操作系统的抽象方法,这个就是产品要实现的共同接口。

public abstract class Computer {
    public abstract void setOperationSystem();
}

第二步:定义具体品牌的电脑类,苹果电脑和小米电脑。

public class MacComputer extends Computer {
    @Override
    public void setOperationSystem() {
        System.out.println("Mac笔记本安装Mac系统");
    }
}
public class MiComputer extends Computer {
    @Override
    public void setOperationSystem() {
        System.out.println("小米笔记本安装Win10系统");
    }
}

第三步:定义工厂,首先定义一个抽象工厂ComputerFactory 接口,里面规定了生产方法,通过这个方法就可以生产出电脑,但是生产不同品牌的电脑的具体方式肯定是不同的,例如生产小米电脑的流水线和生产苹果电脑的流水线肯定是有区别的,所以这个接口方法有具体产品工厂去实现。例如这里的生产苹果电脑的MacComputerFactory 工厂和生产小米电脑的MiComputerFactory 工厂。

public interface ComputerFactory {
     Computer makeComputer();
}
public class MacComputerFactory implements ComputerFactory {
    @Override
    public Computer makeComputer() {
        return new MacComputer();
    }
}
public class MiComputerFactory implements ComputerFactory {
    @Override
    public Computer makeComputer() {
        return new MiComputer();
    }
}

简单工厂模式中那个静态工厂方法就被上面的那些工厂类代替了。

第四步:使用具体的工厂来生产相应品牌的电脑,例如要生产Mac电脑,就构建Mac的生产工厂,然后去生产产品。

    public static void main(String[] args) {
        //生产Mac电脑
        ComputerFactory macFactory=new MacComputerFactory();
        macFactory.makeComputer().setOperationSystem();

        //生产小米电脑
        ComputerFactory miFactory=new MiComputerFactory();
        miFactory.makeComputer().setOperationSystem();
    }

输出:

Mac笔记本安装Mac系统
小米笔记本安装Win10系统

优缺点

优点:不直接在客户端创建具体产品的实例,降低了耦合性。
缺点:每增加一种产品就要相应的增加一个工厂类,比较繁琐。

总结

设计模式值得你刻意练习!

You May Also Like

About the Author: shusheng007

发表评论

邮箱地址不会被公开。