一、简介
建造者模式(Builder Pattern)使用一个个简单的对象一步步的构建成一个复杂的对象,建造者模式同样属于创建类模型。建造者模式隐藏了复杂对象的创建过程,使用者只需告知建造者其需要什么即可。建造者模式适于基本组件不变,但是基本组件的组合常常改变的场景。
建造者模式的UML类图
二、建造者模式的一个实例
在这个实例中,使用建造者模式来描述客厅的装修。客厅装修中,应当包括墙面、电视和沙发,客户将自己的需求告知项目经理,经理指挥工人进行装饰。
- 绘制UML类图
在实现代码之前,我们先将需求转化为UML类图的形式进行描述,以便编写代码时参考。
- 代码实现
- Pruduct类
Product类中定义了产品的种类,提供了设置产品组件的方法,并提供了show()方法以便查看运行效果。
package builder;
public class Product {
private String wall;
private String tv;
private String sofa;
public void setWall(String wall) {
this.wall = wall;
}
public void setTv(String tv) {
this.tv = tv;
}
public void setSofa(String sofa) {
this.sofa = sofa;
}
public void show() {
System.out.println("Product{" +
"wall='" + wall + '\'' +
", tv='" + tv + '\'' +
", sofa='" + sofa + '\'' +
'}');
}
}
- Buidler类
Builder类抽象出了具体建造者需要进行的操作,并负责将产品返回。
package builder;
public abstract class Builder{
protected Product product = new Product();
public abstract void builderWall();
public abstract void builderTV();
public abstract void builderSofa();
public Product getResult(){
return product;
}
}
- Director 类
Director类负责指挥builder进行产品组装,并向客户返回产品。
package builder;
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder = builder;
}
public Product construct(){
builder.builderWall();
builder.builderTV();
builder.builderSofa();
return builder.getResult();
}
}
- ConcreteBuilderA 类
ConcreteBuilderA类,具体的一个建造者,实现了Builder提供的建造方法,使Builder中的产品落地。
package builder;
public class ConcreteBuilderA extends Builder{
@Override
public void builderWall() {
product.setWall("白墙");
}
@Override
public void builderTV() {
product.setTv("小米电视");
}
@Override
public void builderSofa() {
product.setSofa("木质沙发");
}
}
- ConcreteBuilderB 类
ConcreteBuilderB类,作用与ConcreteBuilderA类相同,但是其实现Builder方法产生的产品不同于ConcreteBuilderA类产生的产品。
package builder;
public class ConcreteBuilderB extends Builder{
@Override
public void builderWall() {
product.setWall("砖面墙");
}
@Override
public void builderTV() {
product.setTv("海尔电视");
}
@Override
public void builderSofa() {
product.setSofa("真皮沙发");
}
}
- Client 类
Client类,客户,向Director提需求的人
package builder;
public class Client {
public static void main(String[] args) {
Builder builder = new ConcreteBuilderA();
//Builder builder = new ConcreteBuilderB();
Director director = new Director(builder);
Product product = director.construct();
product.show();
}
}
运行结果
客户选择ConcreteBuilderA类的效果
客户选择ConcreteBuilderB类的效果
三、总结
在上面的实例中可以发现。一个客厅要装饰的地方大体相同(墙、电视以及沙发),而采用不同的创建方案,却是有着不同的效果。客户无需知道具体的创建过程,因为复杂的创建过程由具体的建造者以及Director完成。客户仅仅只需要知道它需要哪个具体建造者并告知Director就可以得到一个复杂的效果。