從做煎餅果子來理解建造者模式
概念
1.基本概念
建造者模式是一種對象構建的設計模式,它可以將複雜對象構建的過程抽象出來,通過抽象過程的不同實現方法可以構造出不同屬性的對象。
2.UML
Product 被構造的複雜對象,ConcreteBuilder創建該產品內部表示和裝配過程
Builder 爲創建Product對象的各個部件指定抽象接口
ConcreteBuilder 實現Builder的接口以構造和裝備該產品的各個部件
Director 構造一個使用Builder的對象
3.適用範圍
當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
當構造過程必須允許被構造的對象有不同表示時。
實現
下面以煎餅果子的構造過程來形象描述建造者模式。
1.首先我們定義一個煎餅果子類,該類對應的是上面(Product(產品))
Pancake.java
public class Pancake {
/**
* 煎餅果子的名字
*/
private String mProductName;
/**
* 製作煎餅果子的的三個步驟
*/
private String mStep1;
private String mStep2;
private String mStep3;
public String getmProductName() {
return mProductName;
}
public String getmStep1() {
return mStep1;
}
public void setmStep1(String mStep1) {
this.mStep1 = mStep1;
}
public String getmStep2() {
return mStep2;
}
public void setmStep2(String mStep2) {
this.mStep2 = mStep2;
}
public String getmStep3() {
return mStep3;
}
public void setmStep3(String mStep3) {
this.mStep3 = mStep3;
}
public void setmProductName(String mProductName) {
this.mProductName = mProductName;
}
}
2.創建構造煎餅果子的抽象建造者(Builder)
PancakeBuilder.java
public abstract class PancakeBuilder {
/**
* 煎餅果子
*/
protected Pancake mPancake;
public Pancake getPanke() {
if (mPancake == null) {
new NullPointerException("product is null");
}
return mPancake;
}
/**
* 創建你的煎餅果子
*/
public void createProduct() {
mPancake = new Pancake();
}
/**
* 抽象的煎餅果子製作過程
*/
public abstract void buildStep1();
public abstract void buildStep2();
public abstract void buildStep3();
}
3.創建具體的構造者 (ConcreteBuilder)
EgePancakeBuilder.java
public class EgePancakeBuilder extends PancakeBuilder {
public void buildStep1() {
System.out.println("放麪醬");
mPancake.setmStep1("放麪醬");
}
public void buildStep2() {
System.out.println("加一個雞蛋");
mPancake.setmStep2("加一個雞蛋");
}
public void buildStep3() {
System.out.println("煎好了卷一下!");
mPancake.setmStep3("煎好了卷一下!");
}
}
4.創建具體的構造者 (ConcreteBuilder)
AbnormalPancakeBuilder.java
public class AbnormalPancakeBuilder extends PancakeBuilder {
public void buildStep1() {
System.out.println("放麪醬");
mPancake.setmStep1("放麪醬");
}
public void buildStep2() {
System.out.println("居然沒有雞蛋");
mPancake.setmStep2("居然沒有雞蛋");
}
public void buildStep3() {
System.out.println("煎好了卷一下!");
mPancake.setmStep2("煎好了卷一下!");
}
}
5.創建攤主,Director(指揮者)
Standower.java
public class Standower {
private PancakeBuilder mPancakeBuilder;
public void setBuilder(PancakeBuilder builder) {
mPancakeBuilder = builder;
}
public Pancake getPanke() {
return mPancakeBuilder.getPanke();
}
public void buildPancake() {
mPancakeBuilder.createProduct();
mPancakeBuilder.buildStep1();
mPancakeBuilder.buildStep2();
mPancakeBuilder.buildStep3();
}
}
Test.java
public class Test {
public static void main(String[] args) {
Standower standower = new Standower();//創建一個攤主
EgePancakeBuilder egePancakeBuilder = new EgePancakeBuilder();//加雞蛋的煎餅構造器
AbnormalPancakeBuilder abnormalPancakeBuilder = new AbnormalPancakeBuilder();//非正常不加雞蛋的煎餅構造器
standower.setBuilder(egePancakeBuilder);//把構造器賦值給攤主,攤主開始按需求造煎餅
standower.buildPancake();
standower.setBuilder(abnormalPancakeBuilder);
standower.buildPancake();
}
}
輸出結果:
放麪醬
加一個雞蛋
煎好了卷一下!
放麪醬
居然沒有雞蛋
煎好了卷一下!