design pattern · 2020-01-28 0

Java设计模式-建造者模式

一、概述

建造者模式又叫生成器模式,是一种对象构建模式。目的将产品和产品建造过程解耦。

二、角色

  • 产品:描述一个由一些列部件组成较为复杂的对象

  • 抽象建造者:描述具体建造者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创建

  • 具体建造者:描述具体建造者,并实现抽象建造者公共接口

  • 指挥者:调用具体建造者来创建对象(产品)的各个部分,并按照一定顺序(流程)来建造复杂对象

三、栗子

1.有序装配构造

通过Client,Director,Builder,Product形成的建造者模式

1) 产品(房子)

public class Product {
    private String basic;
    private String wall;
    private String roof;

    // set、get方法、toString方法
}

2) 抽象建造者

public interface Builder {
    // 地基
    void buildBasic();
    // 墙
    void buildWalls();
    // 房顶
    void buildRoof();
    // 完工-获取产品
    Product getProduct();
}

3) 具体建造者

public class ConcreteBuilder implements Builder {
    private Product product;

    public ConcreteBuilder() {
        product = new Product();
    }

    @Override
    public void buildBasic() {
        product.setBasic("地基");
    }

    @Override
    public void buildWalls() {
        product.setWall("墙");
    }

    @Override
    public void buildRoof() {
        product.setRoof("房顶");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

4) 指挥者

public class Director {
    // 指挥工人按顺序造房
    public Product create(Builder builder) {
        builder.buildBasic();
        builder.buildWalls();
        builder.buildRoof();
        return builder.getProduct();
    }
}

5) 测试

@Test
public void testBuilder1() {
    Director director = new Director();
    Product product = director.create(new ConcreteBuilder());
    System.out.println(product);
}

2.无序装配构造

通过静态内部类方式实现零件无序装配构造

抽象建造者,具体建造者,产品,比第一种方式少了指挥者,主要是因为第二种方式把指挥者交给用户来操作,使得产品的创建更加简单灵活

1) 产品(肯德基)

public class Product {
    private String drink;
    private String snack;

    // set、get方法、toString方法
}

2) 抽象建造者

public interface Builder {
    // 饮料
    Builder buildDrink(String drink);
    // 小吃
    Builder buildSnack(String snack);
    // 获取套餐
    Product build();
}

3) 具体建造者(服务员)

public class ConcreteBuilder implements Builder {
    private Product product;

    public ConcreteBuilder() {
        product = new Product();
    }

    @Override
    public Builder buildDrink(String drink) {
        product.setDrink(drink);
        return this;
    }

    @Override
    public Builder buildSnack(String snack) {
        product.setSnack(snack);
        return this;
    }

    @Override
    public Product build() {
        return product;
    }
}

4) 测试

@Test
public void testBuilder2() {
    ConcreteBuilder concreteBuilder = new ConcreteBuilder();
    Product product = concreteBuilder.buildDrink("可乐")
            .buildSnack("薯条")
            .build();
    System.out.println(product);
}