Builder_建造者模式

在构建复杂的对象时使用,可以分离复杂对象的构建和表示。
主要角色:

  • 产品角色(Product):包含多个组成部件的复杂对象,我们要创建的目标对象。
  • 抽象构建者(Builder):包含创建各部件的抽象方法的接口,和一个返回目标对象的方法。
  • 具体构建者(Concrete Builder):实现接口,完成目标对象的创建方法。
  • 指挥者(Director):调用构造者对象中的方法创建部件,完成目标对象的创建。

运用建造者模式创建类对象

产品角色(Product)

public class Product {
    private String name;
    private Product(){}
    public void setName(String name) { this.name = name; }
    @Override
    public String toString() { return "name: "+name; }
}

抽象构建者(Builder)

public interface Builder {
    void buildName(String name);
    Product build();
}

具体构建者(Concrete Builder)

public class ConcreteBuilder implements Builder {
    private Product product = new Product();
    @Override
    public void buildName(String name) { product.setName(name); }
    @Override
    public Product build() { return product; }
}

指挥者(Director)

public class Director {
    private Builder builder;
    public Director(Builder builder){ this.builder = builder; }
    public Product construct(){
        builder.buildName("lin");
        return builder.build();
    }
}

调用者(Caller)

public class Caller {
    public static void main(String[] args) {
        Product product = new Director(new ConcreteBuilder()).construct();
        System.out.println(product.toString());
    }
}

简化创建过程

建造者(Builder)模式在应用过程中可以根据需要改变,如果创建的产品种类只有一种,只需要一个具体建造者,这时可以省略掉抽象建造者,甚至可以省略掉指挥者角色。

  • 使用内部类省略抽象建造者角色
public class Product {
    private String name;
    private Product(){}
    private void setName(String name) { this.name = name; }
    @Override
    public String toString() { return "name: "+name; }

    static class ProductBuilder {
        private Product product = new Product();
        public ProductBuilder buildName(String name){
            product.setName(name);
            return this;
        }
        public Product build(){ return product; }
    }
}
  • 使用链式调用省略指挥者角色
public class Caller {
    public static void main(String[] args) {
        String product = new Product.ProductBuilder().buildName("lin").build().toString();
        System.out.println(product);
    }
}
posted @ 2022-07-26 23:06  独游空想家  阅读(40)  评论(0编辑  收藏  举报