一文带你学会“工厂方法模式”,不会你揍我

先赞再看,多好的习惯。

在这里插入图片描述

上一篇文章,给大家分享了一下“简单工厂模式”,该模式适用于业务简单或者“产品(不同的类)”数量较少的情况下。

今天,咱们还拿“汽车厂开发生产汽车软件”这个案例进行讲解。

一开始,汽车厂刚刚起步,名声不大,销售额也有限,老板也就只生产国产车,此时我们设计的生产汽车软件,使用“简单工厂模式”还是可以满足需求的。但是随着企业的发展,产业的扩大,老板不再满足只制造国产车,进一步开始涉足合资车。在实际需求的驱使下,我们此时需要开设分公司,来生产合资车。

作为老板,为了方便管理,那么肯定要对公司的整体架构进行重建。建立“总公司”,再开设生产不同汽车的“分公司”,这样方便进行统一管理。此时我们通过“简单工厂模式”设计的软件将不再适用于这种模式。

为适应新的需求,我们要采用新的模式:“工厂方法模式”。

在这里插入图片描述

先简单给大家介绍一下工厂方法模式的基本定义:

定义一个创建对象的抽象方法,然后将对象的实例化推迟到子类,由子类决定要实例化的类。

通过这简单的文字描述,可能无法对“工厂方法模式”具有深入的了解。为此我编写了下列示例代码,以便大家加深对该模式的认知。

第一步:初始化各种车辆类。

定义生产车辆的抽象类

public abstract class Vehicle {

  /**
   * 生产车的抽象方法
   */
  public abstract void production();
}

定义实现该抽象类的子类

/**
 * 国产轿车
 */
public class DomesticCar extends Vehicle {

  @Override
  public void production() {
    System.out.println("生产出一辆国产轿车!");
  }
}

/**
 * 国产SUV
 */
public class DomesticSUV extends Vehicle {

  @Override
  public void production() {
    System.out.println("生产出一辆国产SUV!");
  }
}

/**
 * 国产货车
 */
public class DomesticTruck extends Vehicle {

  @Override
  public void production() {
    System.out.println("生产出一辆国产货车!");
  }
}

/**
 * 合资轿车
 */
public class JointVentureCar extends Vehicle {

  @Override
  public void production() {
    System.out.println("生产出一辆合资轿车!");
  }
}

/**
 * 合资SUV
 */
public class JointVentureSUV extends Vehicle {

  @Override
  public void production() {
    System.out.println("生产出一辆合资SUV!");
  }
}

/**
 * 合资货车
 */
public class JointVentureTruck extends Vehicle {

  @Override
  public void production() {
    System.out.println("生产出一辆合资货车!");
  }
}

第二步:定义一个创建对象的抽象方法(老板的总公司)。

public abstract class Factory {

  // 创建车辆子类实例的抽象方法。
  public abstract Vehicle createVehicle(String vehicleType);
}

第三步:将对象的实例化推迟到子类(总公司下的子公司)。

/**
 * 生产国产车的工厂
 */
public class DomesticFactory extends Factory{

  @Override
  public Vehicle createVehicle(String vehicleType) {
    Vehicle vehicle = null;
    switch (vehicleType) {
      case "car":
        vehicle = new DomesticCar();
        break;
      case "suv":
        vehicle = new DomesticSUV();
        break;
      case "truck":
        vehicle = new DomesticTruck();
        break;
    }
    return vehicle;
  }
}

/**
 * 生产合资车的工厂
 */
public class JointVentureFactory extends Factory{

  @Override
  public Vehicle createVehicle(String vehicleType) {
    Vehicle vehicle = null;
    switch (vehicleType) {
      case "car":
        vehicle = new JointVentureCar();
        break;
      case "suv":
        vehicle = new JointVentureSUV();
        break;
      case "truck":
        vehicle = new JointVentureTruck();
        break;
    }
    return vehicle;
  }
}

第四步定义测试类:

public class Demo {

  public static void main(String[] args) {
    Factory domesticFactory = new DomesticFactory();
    domesticFactory.createVehicle("car").production();
    Factory jointVentureFactory = new JointVentureFactory();
    jointVentureFactory.createVehicle("car").production();
  }
}

总结:

相对于“简单工厂模式”而言,“工厂方法模式”遵守了ocp原则。当增加新的产品时,只需要添加具体的产品子类和其对应的工厂类即可,不用修改原有的代码。并且该模式更利于程序的扩展和维护。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/first_M/article/details/107499920