生成器设计模式

  1. 生成器设计模式:它将复杂对象的构建与其表示相互分离,使得在同样的构建过程中可以创建不同的表示
    • 能够从简单的对象一步一步生成复杂的对象。生成器模式是一种用来逐步构建复杂对象并在最后一步返回对象的创造型模式
    • 生成器模式隐藏了产品构建过程中的内部细节。各个生成器之间都是相互独立的。这提高了代码的模块化,并使其他的生成器更方便的创建对象。因为每个生成器都能够逐步创建对象,这让我们能够很好的对最终的产品进行掌控
  2. 生成器模式UML
    • 生成器类Builder):提供一个接口用于创建产品的各个组成部件。具体生成器(ConcreteBuilder)提供此接口的实现

    • 具体生成器ConcreteBuilder):会跟踪其所创建对象的表现形式,并在创建对象的同时提供一个接口获取产品(Product

    • 导演类Director):通过生成器提供的接口构造对象。产品类用于表示被构造的复杂对象。这包括对我们构建的所有类进行定义

      [外链图片转存失败(img-yMYwwiuj-1567174768718)(D:\Desktop\设计模式\生成器设计模式.png)]

  3. 示例:
    /** * @author xiao儿 * @date 2019/8/29 22:33 * @Description CarPlan */
    public interface CarPlan {
        public void setBase(String basename);
        public void setWheels(String wheels);
        public void setEngine(String engine);
        public void setRoof(String roof);
        public void setMirrors(String mirrors);
        public void setLights(String lights);
        public void setInterior(String interior);
    }
    
    /** * @author xiao儿 * @date 2019/8/29 22:36 * @Description Car * 如果使用了抽象类,那就是对抽象类进行扩展 */
    public class Car implements CarPlan {
        private String basename;
        private String wheels;
        private String engine;
        private String roof;
        private String mirrors;
        private String lights;
        private String interior;
    
        @Override
        public void setBase(String basename) {
            this.basename = basename;
        }
    
        @Override
        public void setWheels(String wheels) {
            this.wheels = wheels;
        }
    
        @Override
        public void setEngine(String engine) {
            this.engine = engine;
        }
    
        @Override
        public void setRoof(String roof) {
            this.roof = roof;
        }
    
        @Override
        public void setMirrors(String mirrors) {
            this.mirrors = mirrors;
        }
    
        @Override
        public void setLights(String lights) {
            this.lights = lights;
        }
    
        @Override
        public void setInterior(String interior) {
            this.interior = interior;
        }
    }
    
    /** * @author xiao儿 * @date 2019/8/29 22:40 * @Description CarBuilder * 定义生成器接口 */
    public interface CarBuilder {
        public void buildBase();
        public void buildWheels();
        public void buildEngine();
        public void buildRoof();
        public void buildMirrors();
        public void buildLights();
        public void buildInterior();
        public Car getCar();
    }
    
    /** * @author xiao儿 * @date 2019/8/29 22:42 * @Description LowPriceCarBuilder * 生成器第一个实现(具体生成器) */
    public class LowPriceCarBuilder implements CarBuilder {
        private Car car;
    
        public LowPriceCarBuilder() {
            car = new Car();
        }
    
        @Override
        public void buildBase() {
            car.setBase("Low priced base");
        }
    
        @Override
        public void buildWheels() {
            car.setWheels("Cheap Tyres");
        }
    
        @Override
        public void buildEngine() {
            car.setEngine("Low Quality Engine");
        }
    
        @Override
        public void buildRoof() {
            car.setRoof("No flexible roof");
        }
    
        @Override
        public void buildMirrors() {
            car.setMirrors("Cheap Mirrors");
        }
    
        @Override
        public void buildLights() {
            car.setLights("Cheap Lights");
        }
    
        @Override
        public void buildInterior() {
            car.setInterior("Cheap Interior");
        }
    
        @Override
        public Car getCar() {
            return this.car;
        }
    }
    
    /** * @author xiao儿 * @date 2019/8/29 22:49 * @Description HighEndCarBuilder * 生成器的第二个实现(具体生成器) */
    public class HighEndCarBuilder implements CarBuilder {
        private Car car;
    
        public HighEndCarBuilder() {
            car = new Car();
        }
    
        @Override
        public void buildBase() {
            car.setBase("Quality base");
        }
    
        @Override
        public void buildWheels() {
            car.setWheels("Quality Tyres");
        }
    
        @Override
        public void buildEngine() {
            car.setEngine("High-end Engine");
        }
    
        @Override
        public void buildRoof() {
            car.setRoof("Flexible roof");
        }
    
        @Override
        public void buildMirrors() {
            car.setMirrors("Quality Mirrors");
        }
    
        @Override
        public void buildLights() {
            car.setLights("Quality Lights");
        }
    
        @Override
        public void buildInterior() {
            car.setInterior("High-end Interior");
        }
    
        @Override
        public Car getCar() {
            return this.car;
        }
    }
    
    /** * @author xiao儿 * @date 2019/8/29 22:54 * @Description MechanicalEngineer * 导演类 */
    public class MechanicalEngineer {
        private CarBuilder carBuilder;
    
        public MechanicalEngineer(CarBuilder carBuilder) {
            this.carBuilder = carBuilder;
        }
    
        public Car getCar() {
            return carBuilder.getCar();
        }
    
        public void buildCar() {
            carBuilder.buildBase();
            carBuilder.buildWheels();
            carBuilder.buildEngine();
            carBuilder.buildRoof();
            carBuilder.buildMirrors();
            carBuilder.buildLights();
            carBuilder.buildInterior();
        }
    }
    
    /** * @author xiao儿 * @date 2019/8/29 22:57 * @Description Main */
    public class Main {
        public static void main(String[] args) {
            CarBuilder lowPriceCarBuilder = new LowPriceCarBuilder();
            MechanicalEngineer engineer = new MechanicalEngineer(lowPriceCarBuilder);
            engineer.buildCar();
            Car car = engineer.getCar();
            System.out.println("Builder Constructed Car:" + car);
        }
    }
    
  4. 生成器模式举例
    • Java API中,StringBufferStringBuilder及时生成器模式的适用示例
  5. 抽象工厂模式和生成器模式之间的区别

    抽象工厂也可以用于构建一个复杂的对象。在生成器模式中,核心hi逐步完成对象构建。生成器模式将对象构建的过程分解为很多个小步骤。在每一步中又能够包含不同的构建逻辑。

    同时,生成器模式还包含了一个对象构建序列。它会从步骤1开始运行一直到步骤n,并在最后一步完成后返回构建完成的对象。在这些步骤中,每一步都将向对象中添加一些逻辑或参数值。在抽象模式中尽管也可以构建相当复杂的对象,但它不会使用步骤来完成对象构造。

    在抽象工厂模式中,主要是由工厂根据需要主动创建各种子类型的对象。

    抽象工厂方法模式的用户不需要知道该对象确切的子类型。

    生成器模式描述对象时已经明确了对象的类型,只不过还需要通过若干不同的步骤来实现对象不同的表示方法