Builder模式的UML图
类图
时序图
Builder模式的角色
Director :调用具体的Builder去构建对象
Builder : 抽象接口,规范产品对象的各个组成部分的构建
ConcreteBuilder : 实现builder类抽象接口,建造过程完成后,返回产品
Product : 建造的产品对象
Builder模式的优点
- 调用者无需知道构造细节
- 可以更精细的控制构建过程
- 将构建过程和部件解耦
- 使用不同的builder,相同的构建过程,能够产生不同的对象
一个Builder模式
Director
public class Director { private Builder builder; public Director(Builder b) { builder = b; } public void construct(){ builder.buildFloor(); builder.buildHousetop(); builder.buildWall(); } }
Builder
public interface Builder { public void buildFloor(); public void buildWall(); public void buildHousetop(); public House getResult(); }
ConcreateBuilder1
public class PingFangBuilder implements Builder { private House house = new House(); @Override public void buildFloor() { house.setFloor("平房->地板"); } @Override public void buildWall() { house.setWall("平房->墙"); } @Override public void buildHousetop() { house.setHousetop("平房->房顶"); } @Override public House getResult() { return house; } }
ConcreteBuilder2
public class GongyuBuilder implements Builder { private House house = new House(); @Override public void buildFloor() { house.setFloor("公寓地板"); } @Override public void buildWall() { house.setWall("公寓墙"); } @Override public void buildHousetop() { house.setHousetop("公寓屋顶"); } @Override public House getResult() { return house; } }
Product
public class House { private String floor; private String wall; private String housetop; public String getFloor() { return floor; } public void setFloor(String floor) { this.floor = floor; } public String getWall() { return wall; } public void setWall(String wall) { this.wall = wall; } public String getHousetop() { return housetop; } public void setHousetop(String housetop) { this.housetop = housetop; } }
Client
public class MainClass { public static void main(String[] args) { Builder builder1 = new PingFangBuilder(); Director director1 = new Director(builder1); director1.construct(); House house1 = builder1.getResult(); GongyuBuilder builder2 = new GongyuBuilder(); Director director2 = new Director(builder2); director2.construct(); House house2 = builder2.getResult(); } }