建造者模式也屬於創建型模式,它提供了一種創建對象的最佳模式
用戶只需要給定複雜對象的類型和內容,建造者模式負責按順序創建複雜對象
應用場景
- 需要生成的產品對象有複雜的內部結構,這些產品對象具備共性
- 隔離複雜對象的創建和使用,並獲得相同的創建過程可以創建不同的產品
- 適合於一個具有較多的零件(屬性)的產品的創建過程
實現:蓋房子之地基、鋼筋工程、鋪電線和粉刷
Builder.java
package com.li.builder.demo;
//抽象的建造者:方法
public abstract class Builder {
public abstract void buildA(); //地基
abstract void buildB(); //鋼筋工程
abstract void buildC(); //鋪電線
abstract void buildD(); //粉刷
//完工:得到產品
abstract Product getproduct();
}
Director.java
package com.li.builder.demo;
//指揮:核心。負責指揮構建一個工程。工程創建由它決定
public class Director {
//指揮工人按照順序建房子
public Product build(Builder builder){
builder.buildA();
builder.buildB();
builder.buildC();
builder.buildD();
return builder.getproduct();
}
}
Product.java
package com.li.builder.demo;
//產品:房子
public class Product {
private String buildA;
private String buildB;
private String buildC;
private String buildD;
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public String getBuildD() {
return buildD;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
//方便測試輸出
@Override
public String toString() {
return "Product{" +
"buildA='" + buildA + '\'' +
", buildB='" + buildB + '\'' +
", buildC='" + buildC + '\'' +
", buildD='" + buildD + '\'' +
'}';
}
}
Worker.java
package com.li.builder.demo;
//具體的建造者:工人
public class Worker extends Builder {
private Product product;
public Worker() {
product = new Product();
}
@Override
public void buildA() {
product.setBuildA("地基");
System.out.println("地基");
}
@Override
void buildB() {
product.setBuildB("鋼筋工程");
System.out.println("鋼筋工程");
}
@Override
void buildC() {
product.setBuildC("鋪電線");
System.out.println("鋪電線");
}
@Override
void buildD() {
product.setBuildD("粉刷");
System.out.println("粉刷");
}
@Override
Product getproduct() {
return product;
}
}
測試
package com.li.builder.demo;
public class Test {
public static void main(String[] args) {
//指揮
Director director = new Director();
//指揮 具體的工人完成 產品
Product build = director.build(new Worker());
System.out.println(build.toString());
}
}