创建型设计模式(一)工厂方法模式

文章更新时间:2020/07/15

一、一句话背景

我需要一辆汽车,那我可以直接从工厂里面提货,而不用去管汽车是怎么做出来的,以及生产汽车的具体实现,我只需要告诉这个工厂要生产什么品牌的汽车就好,具体的汽车生产过程我也不用管。

二、使用场景

使用场景:知道部分特性而创建具体对象的场景。

如:根据环境类型(dev,test或master等)直接调用一整套环境配置

优点:

  • 客户端不需要在负责对象的创建,明确了各个类的职责
  • 如果有新的对象增加,只需要增加一个具体产品类和具体的工厂类即可
  • 不会影响已有的代码,后期维护容易,增强系统的扩展性

缺点:

  • 需要额外的编写代码,增加了工作量【额外编写具体工厂类和具体产品类】

与简单工厂的区别:

  • 简单工厂:工厂类包含了具体的逻辑判断,增加类型时需要修改工厂类代码
  • 工厂方法:工厂类只定义生成抽象产品的方法,增加类型时不需要修改原来的工厂类代码,但需要新增工厂类和实现工厂类的具体产品类

三、模型分析

工厂定义创建抽象产品的方法,由具体工厂去实现,生成具体产品

抽象产品定义产品的共有属性和方法,由具体产品去继承

具体工厂实现/继承工厂类,生产具体产品

具体产品实现/继承抽象产品

四、UML类图

五、代码分析

工厂

/**
 * 汽车工厂【工厂】
 */
public interface CarFactory {

    /**
     * 生产汽车的方法
     */
    Car produceCar();

}

具体工厂

奥迪车工厂

/**
 * 奥迪车工厂【具体工厂】
 */
public class AudiFactory implements CarFactory {

    @Override
    public Car produceCar() {
        //实现工厂接口定义的方法,生产奥迪车
        return new AudiCar();
    }
}

奔驰车工厂

/**
 * 奔驰车工厂【具体工厂】
 */
public class BenzFactory implements CarFactory {

    @Override
    public Car produceCar() {
        //实现工厂接口定义的方法,生产奔驰车
        return new BenzCar();
    }
}

宝马车工厂

/**
 * 宝马车工厂【具体工厂】
 */
public class BmwFactory implements CarFactory {

    @Override
    public Car produceCar() {
        //实现工厂接口定义的方法,生产宝马车
        return new BmwCar();
    }
}

抽象产品

/**
 * 汽车【抽象产品】
 */
public abstract class Car {

    /**
     * 驾驶
     */
    public abstract void drive();

}

具体产品

奥迪车 

/**
 * 奥迪车【具体产品】
 */
public class AudiCar extends Car {
    @Override
    public void drive() {
        System.out.println("奥迪车驾驶综合体验不错~~~");
    }
}

奔驰车 

/**
 * 奔驰车【具体产品】
 */
public class BenzCar extends Car {
    @Override
    public void drive() {
        System.out.println("奔驰车驾驶体验豪华平稳~~~");
    }
}

宝马车

/**
 * 宝马车【具体产品】
 */
public class BmwCar extends Car {
    @Override
    public void drive() {
        System.out.println("宝马车驾驶体验运动感十足~~~");
    }
}

客户下单

/**
 * 工厂模式测试类【模拟下单】
 */
public class FactoryTest {
    public static void main(String[] args) throws Exception {
        //客户要买“宝马”车,则我们实例化一个宝马工厂出来
        CarFactory carFactory = new BmwFactory();
        //调用工厂里生产汽车方法
        Car car = carFactory.produceCar();
        //开车车咯~~~
        car.drive();
    }
}

原文地址:https://www.cnblogs.com/riches/p/11198488.html