建造模式
有些情况,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象都不能为一个完整的产品使用。比如一封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(); } }