初探设计模式:建造者模式

建造者模式与装饰器模式区别:

装饰器模式是针对相同的处理方案,添加额外装饰
建造者模式是针对固有的多种处理方式,选择性组合起来达成不同的结果

建造者模式的关键,是将复杂对象的构建过程与它本身的表示分离,使得同样的构建过程可以创建不同的表示

以饭店商品出单为例:

1. 先定义一个商品类
public class Product {

    /**
     * 套餐内容
     */
    private ArrayList<String> parts = new ArrayList<String>();

    public void add(String part) {
        parts.add(part);
    }

    public void show() {
        System.out.println(parts);
    }
}
2. 使用抽象类定义出店家可供选择的商品
public abstract class ProductBuilder {

    /**
     * 米饭
     */
    public abstract void rice();

    /**
     * 面条
     */
    public abstract void noodle();

    /**
     * 饮料
     */
    public abstract void drink();

    /**
     * 汤
     */
    public abstract void soup();

    /**
     * 获取结果
     * @return
     */
    public abstract Product build();
}
3. 商品的具体实现(后厨)
public class ProductBuilderConcrete extends ProductBuilder {

    private Product product = new Product();

    /**
     * 米饭
     */
    @Override
    public void rice() {
        product.add("米饭");
    }

    /**
     * 面条
     */
    @Override
    public void noodle() {
        product.add("面条");
    }

    /**
     * 饮料
     */
    @Override
    public void drink() {
        product.add("饮料");
    }

    /**
     * 汤
     */
    @Override
    public void soup() {
        product.add("汤");
    }

    /**
     * 获取结果
     *
     * @return
     */
    @Override
    public Product build() {
        return product;
    }
}
4. 商品选择搭配(套餐选择)
public class ProductDirectorOne {
    private ProductBuilder builder;

    public ProductDirectorOne(ProductBuilder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.drink();
        builder.noodle();
    }
}
public class ProductDirectorTwo {
    private ProductBuilder builder;

    public ProductDirectorTwo(ProductBuilder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.rice();
        builder.soup();
    }
}
5. 客户端下单
public class BuilderModeClient {

    public static void main(String[] args) {
        // 顾客一的搭配
        customerOne();
        // 顾客二的搭配
        customerTwo();
    }

    private static void customerOne() {
        // 取出菜单
        ProductBuilder builder = new ProductBuilderConcrete();
        // 选择套餐
        ProductDirectorOne one = new ProductDirectorOne(builder);
        one.construct();
        // 交给后厨,准备上菜
        Product product = builder.build();
        product.show();
    }

    private static void customerTwo() {
        // 取出菜单
        ProductBuilder builder = new ProductBuilderConcrete();
        // 选择套餐
        ProductDirectorTwo two = new ProductDirectorTwo(builder);
        two.construct();
        // 交给后厨,准备上菜
        Product product = builder.build();
        product.show();
    }
}
上一篇:设计模式---建造者模式(Builder)


下一篇:.net 6 中使用Autofac