學習筆記【23種設計模式-第五節:建造者模式】
阿新 • • 發佈:2020-12-16
建造者模式
簡述:
建造者模式又叫生成器模式 ,是一種物件構建模式,它可以將複雜的建造過程抽象出來,使這個抽象過程的不同實現方式可以構造出不同表現(屬性)的物件。
- 建造者模式 使一步一步建立一個複雜的物件,它允許使用者只通過指定複雜物件的型別和內容就可以構建他們,使用者不需要知道內部的具體構造細節。
建造者模式的四個角色
- Product(產品角色) :一個具體的產品物件。
- Builder (抽象建造者) :建立一個Product物件的各個部件指定的介面。
- ConcreteBuilder(具體建造者) :實現介面,狗i按和裝配各個部件。
- Director(指揮者)
建房子
House(Product):
public class House {//->product
private String basic;
private String wall;
private String roofed;
public String getBaise() {
return basic;
}
public void setBaise(String baise) {
this.basic = baise;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoofed() {
return roofed;
}
public void setRoofed(String roofed) {
this.roofed = roofed;
}
}
HouseBuilder(抽象建造者):
public abstract class HouseBuilder {
protected House house=new House();
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void buildRoofed();
public House buildHouse(){
return house;
}
}
CommonHouse(具體建造者1):
public class CommonHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("普通房子打地基5米");
}
@Override
public void buildWalls() {
System.out.println("普通房子砌牆10cm");
}
@Override
public void buildRoofed() {
System.out.println("普通房子蓋屋頂");
}
}
HighBuilding(具體建造者2):
public class HighBuilding extends HouseBuilder{
@Override
public void buildBasic() {
System.out.println("高樓打地基100米");
}
@Override
public void buildWalls() {
System.out.println("高樓砌牆20cm");
}
@Override
public void buildRoofed() {
System.out.println("高樓的透明屋頂");
}
}
HouseDirector(指揮者):
public class HouseDirector {
HouseBuilder houseBuilder;
//通過構造器
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//通過set
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public House constructHouse(){
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.buildRoofed();
return houseBuilder.buildHouse();
}
}
Client方法:
public class Client {
public static void main(String[] args) {
CommonHouse commonHouse=new CommonHouse();
HouseDirector houseDirector=new HouseDirector(commonHouse);
House house=houseDirector.constructHouse();
System.out.println("----------------");
HighBuilding highBuilding=new HighBuilding();
houseDirector.setHouseBuilder(highBuilding);
House house1=houseDirector.constructHouse();
}
}
結果:
StringBuilder的原始碼體現的也是建造者模式
- Appendable介面定義了多個append方法(抽象方法),即Appendable就像抽象建造者,定義了抽象方法。
- AbstractStringBulider實現了Appendable介面的方法,這裡的AbstractStringBulider其實已經是一個建造者,只不過不能例項化(因為它是抽象的)。
- StringBuilder即充當了指揮者,同時充當了具體的建造者,建造方法的實現是由AbstractStringBulider實現的,只不過StringBuilder繼承了AbstractStringBulider。
注意事項:
- 客戶端(實用程式)不必知道產品內部組成的細節,將本產品本身與產品的建立過程解耦,使得相同的建立過程可以建立不同的產品物件。
- 每一個具體建造者都是相對獨立,與其他的具體建造者無關,因此可以很方便的替換具體建造者或者增加新的具體建造者,使用者使用不同的具體建造者即可得到不同的產品物件。
- 可以更加精細的控制產品的建立過程。將複雜的產品的建立不走分解在不同的方法中,使得建立過程更加的清晰,也更方便實用程式來控制建立過程。
- 增加新的具體建造者無需修改原有 類庫的程式碼,指揮者類針對抽象建造者程式設計,系統擴充套件方便,符合OCP原則。
- 建造者模式所建立的產品一般具有較多的共同點,其他組成部分相似,如果產品之間的差異性很大,則不適合使用創造者模式,因此其適用範圍受到一定的限制。
- 如果產品的內部變化複雜,可能導致需要定義很多具體創造者類來實現這種變化,導致系統變得很龐大,這時要考慮是否選擇建造者模式。
- 抽象工廠模式vs建造者模式: 抽象工廠模式實現對產品家族的常見,一個產品家族是這樣的一系列產品:具有不同分類維度的產品組合,採用抽象工廠模式不需要關心建立構建過程,只關心產品有什麼工廠生產即可。而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是通過組裝零配件而產生一個新產品。