这个比较难理解,先看例子,你家里要装修,要打造一个家具,你爸和商场里的人说了要预定沙发
沙发的属性
public class Product { //沙发的底 private String partA;
//沙发的靠枕 private String partB;
//沙发的皮 private String partC; public void setPartA(String partA) { this.partA = partA; } public void setPartB(String partB) { this.partB = partB; } public void setPartC(String partC) { this.partC = partC; } public void show(){ System.out.println("可以被使用"); } }
产品组装手册(每个家具的拼装手册和步骤都不一样,所以要抽象出来)
abstract class Builder { //产品最后要拼装好 protected Product product=new Product();
//拼接部件A public abstract void buildPartA();
//拼接部件B public abstract void buildPartB();
//拼接部件C public abstract void buildPartC(); //产品拼装好 public Product returnProduct(){ return product; } }
具体的沙发拼装手册
public class BuilderA extends Builder { @Override public void buildPartA() { product.setPartA("建造A部分"); } @Override public void buildPartB() { product.setPartA("建造B部分"); } @Override public void buildPartC() { product.setPartA("建造C部分"); } }
商场老板叫家具师傅拼装
public class Director {
//拿好手册 private Builder builder; //老板提供手册 public Director(Builder builder) { this.builder = builder; } //产品组装 public Product construct(){
//拼装部件A,B,C
builder.buildPartA(); builder.buildPartB(); builder.buildPartC();
//拼装好之后返回这个产品 return builder.returnProduct(); } }
去商场提沙发
public class Client { public static void main(String[] args) {
//有人要买沙发 BuilderA builderA = new BuilderA();
//老板找到沙发拼装手册 Director director = new Director(builderA);
//老板叫师傅拼装好沙发 Product construct = director.construct();
//沙发已经好了,可以使用了 construct.show(); } }
由上面的例子可以看出,一个建造者模式设计4个角色
产品(沙发):包含多个组件的复杂对象
抽象建造者(拼装手册):一个包含创建产品各个成员组件的抽象类
具体建造者(具体的产品拼装方法): 实现创建产品各个部件的具体创造方法
指挥者(老板):调用抽象建造者对象中的组装方法完成对象的创建,不涉及产品的具体拼装过程
总结来说 建造者模式就是将某个复杂对象的成员属性进行拆分,由具体的建造者来建造,指挥者只需要调用具体建造者的方法来进行组件拼装,具体的细节交给建造者来实现。
应用场景:创建的对象虽然很复杂,会有多个部件,各部件也由可能发生变化,但组装顺序还是相对稳定的。