Builder

建造模式

有些情况,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象都不能为一个完整的产品使用。比如一封Email,必须有发件人地址、主题、内容等信息,否则是不能发送出去的。此时,这对象相当于一个有待建造的产品,而对象的性质相当于产品的零件。建造产品的过程就是建造零件的过程,建造者返回给客户端的是一个全部零件都建造好的产品对象。

在这个示意的UML图,最终产品 Product 只有两个零件:part1 和 part2 , 相应的建造方法是 builderPart1 和 builderPart2 。

  • 抽象建造者(Builder)角色:给出一个抽象接口,给规范产品的对象的各个组成成分的建造。具体建造者除了建造的方法之外,还要有一个返回结果的方法(retrieveResult)。一般来说,有多少零件,就有多少个建造方法。
  • 具体建造者(Concrete Builder):创建产品的实例
  • 导演者(Director):调用建造者角色以及其产品,导演者并没有产品类的具体知识,真正拥有产品类的具体知识是建造者角色。
  • 产品(Product):建造中的复杂对象。在系统中会多于一个产品类,而且这些产品类不一定同一个接口,可以完全无关联的。
public abstract class Builder {

    public abstract void builderPart1();

    public abstract void builderPart2();

    public abstract Product retrieveResult();
}
public class ConcreteBuilder extends Builder {

    private Product product = new Product();
    
    @Override
    public void builderPart1() {
        product.add("-- builderPart1");
    }

    @Override
    public void builderPart2() {
        product.add("-- builderPart2");
    }

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

}
public class Product {

    private LinkedList<String> parts = new LinkedList<String>();

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

    public void show() {
        for (String part : parts) {
            System.out.println(part);
        }
    }

}
public class Director {

    private Builder builder;
    
    public Director(){
        
    }
    
    public void construct(){
        builder = new ConcreteBuilder();
        builder.builderPart1();
        builder.builderPart2();
        builder.retrieveResult();
    }
    
}
原文地址:https://www.cnblogs.com/xuekyo/p/2830384.html