建造者模式(Builder pattern)

建造者模式(Builder pattern)是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

  简单的说,新建一个由多个部分组成的对象,多个部分交给Builder(建造者)完成。如果对建造的顺序有要求,由一个指挥者决定每个部分的建造顺序。

 

1,定义一个产品:

public class Product {
    List<String> parts = new ArrayList<String>();

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

    public void show(){
        System.out.println("对象内部样子:");
        for (String str :
                parts) {
            System.out.println(str);
        }
    }
}

2,所有的建造者需要继承此抽象类

public abstract class Builder {
    public abstract void builderPart1();
    public abstract void builderPart2();
    public abstract Product getResult();
}

3,定义两个建造者(具体工作实现,两个是为了更好的理解)

public class ConcreteBuilder1 extends Builder {

    private Product product = new Product();

    @Override
    public void builderPart1() {
        product.add("partA");
    }
    @Override
    public void builderPart2() {
        product.add("partB");   
    }
    @Override
    public Product getResult() {
        return product;
    }
}

public class ConcreteBuilder2 extends  Builder{
    private Product product = new Product();

    @Override
    public void builderPart1() {
        product.add("part X");
    }
    @Override
    public void builderPart2() {
        product.add("part Y");
    }
    @Override
    public Product getResult() {
        return product;
    }
}

4,定义一个指挥者(决定建造内部的顺序)

public class Director {
    public void Construct(Builder builder){
        builder.builderPart1();
        builder.builderPart2();
    }
}

5,得到产品

public class BuilderPattern {
    public static void main(String[] args) {
        Director director = new Director();
        Builder builder1 = new ConcreteBuilder1();
        Builder builder2 = new ConcreteBuilder2();
        director.Construct(builder1);
        //director.Construct(builder2);
        Product result = builder1.getResult();
        result.show();
    }
}

6,执行结果

产品内部样子:
partA
partB

Process finished with exit code 0

如果将

director.Construct(builder1);

这句代码也注释掉,无论打不打开

director.Construct(builder2);

运行代码,产品内部什么都没有

产品内部样子:

Process finished with exit code 0

 

使用建造者模式,可以让对象的组成部分(建造方式实现)和算法(如:建造顺序)相独立。

 

附:有印象在什么地方使用过建造者模式,一时想不起来,想到了会补充。

 

posted @ 2018-12-19 20:17  dioag  阅读(119)  评论(0编辑  收藏  举报