设计模式之建造者模式

顾名思义,建造者负责建造产品,建造者模式是将产品的建造能按照一定的顺序建造,控制产品建造过程,把产品的构建过程规范化。用官方的定义就是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造这模式的使用是的产品的内部表示可以独立的变化,并且客户端也不必知道产品内部组成的细节,当创建复杂对象的方法独立于该对象的组成部分以及它们的装配方式时或者当被构造的对象的构造过程有不同的表示时可以使用建造者模式。

建造着模式包括以下角色

  • 抽象建造者:提供抽象建造方法,并且提供返回一个完整产品的方法
  • 具体建造者:实现了抽象建造者接口,写明了每一个产品零件建造具体过程,并且构建装配好产品,将完整的产品返回。
  • 导演类:负责产品每个零件的建造顺序,在它的内部使用了建造者类。
  • 产品类:定义了各个零件的属性

具体看一个实例来加深一下对各个角色的理解

产品类

package com.song.dp.builder;
public class Product {
    String part1;
    String part2;
    String part3;
    public String getPart1() {
        return part1;
    }
    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public String getPart2() {
        return part2;
    }
    public void setPart2(String part2) {
        this.part2 = part2;
    }
    public String getPart3() {
        return part3;
    }
    public void setPart3(String part3) {
        this.part3 = part3;
    }
}

抽象建造者

package com.song.dp.builder;
public interface Builder {
    public void buildPart1();
    public void buildPart2();
    public void buildPart3();
    public Product getProduct();
}

具体建造者

package com.song.dp.builder;
public class ConcreteBuilder implements Builder {
    Product product0 =new Product();
    
    @Override
    public void buildPart1() {
        product0.setPart1("第1部分是编写项目原理图");
        System.out.println("原理图已完成");
    }
    
    @Override
    public void buildPart2() {
        product0.setPart2("第2部分是硬件接线");
        System.out.println("硬件部分已完成");
    }
    
    @Override
    public void buildPart3() {
        product0.setPart2("第3部分是软件编写");
        System.out.println("软件部分已完成");
    }

    @Override
    public Product getProduct() {
        System.out.println("整个系统被搭建好了");
        return product0;
    }

}

导演类

package com.song.dp.builder;
public class Director {
    private Builder builder;
    public Director(Builder builder){
        this.builder = builder;
    }
    public void construct(){
        builder.buildPart1();
        builder.buildPart2();
        builder.buildPart3();
    }
}

最后测试一下

package com.song.dp.builder;
import static org.junit.Assert.*;
import org.junit.Test;
public class testBuilder {

    @Test
    public void test() {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.construct();
        Product product = builder.getProduct();
    }
}

输出结果

原理图已完成
硬件部分已完成
软件部分已完成
整个系统被搭建好了

相关推荐