一,建造者模式
建造者模式:
- 又叫生成器模式,一種對象構建模式,將複雜對象的建造過程抽象出來,抽象的方法可以由子類不同的需求實現出來;
- 建造者模式是一步一步創建一個複雜對象的,只通過指定複雜對象的類型和內容就可以構建出來,使用者不需要知道具體的內部細節;
二,原理類圖
意圖: 將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
適用性:
- 當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
- 當構造過程必須允許被構造的對象有不同的表示時。
三,實例
四個角色:
- Produce(產品:具體對象);
- Builder(抽象建造者:創建Produce的接口、抽象類,只負責產品對象構建的整個流程,不關心細節);
- ConcreteBuilder(具體建造者:Builder的實現,用於構建和組裝具體的Produce);
- Director(指揮者:構建一個調用Builder的對象,用於創建複雜對象,即隔離了客戶與對象的生產過程,又負責控制 產品對象的生產過程)
1,Produce:
package com.neei.builder;
/**
* 產品Produce
*/
public class House {
private String basic;
private String wall;
private String roofed;
public String getBasic() {
return basic;
}
public void setBasic(String basic) {
this.basic = basic;
}
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;
}
}
2,Builder:
package com.neei.builder;
/**
* Builder(抽象建造者:創建Produce的接口、抽象類,只負責產品對象構建的整個流程,不關心細節)
*/
public abstract class HouseBuilder {
//需要組合進來需要建造的產品類
protected House house=new House();
//構建對象的流程
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void buildFooled();
//返回構建的對像
public House buildHouse(){
return house;
}
}
3,ConcreteBuilder:
package com.neei.builder;
/**
* 具體建造者:Builder的實現,用於構建和組裝具體的Produce
*/
public class CommonHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("普通房子打地基");
}
@Override
public void buildWalls() {
System.out.println("普通房子砌牆");
}
@Override
public void buildFooled() {
System.out.println("普通房子蓋頂");
}
}
package com.neei.builder;
/**
* 具體建造者:Builder的實現,用於構建和組裝具體的Produce
*/
public class HighHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("高樓打地基");
}
@Override
public void buildWalls() {
System.out.println("高樓砌牆");
}
@Override
public void buildFooled() {
System.out.println("高樓蓋頂");
}
}
4,Director:
package com.neei.builder;
/**
* 指揮者:構建一個調用Builder的對象,用於創建複雜對象,
* 即隔離了客戶與對象的生產過程,又負責控制產品對象的生產過程
*/
public class HouseDirector {
private HouseBuilder builder;
public HouseDirector() {
}
public HouseDirector(HouseBuilder builder) {
this.builder = builder;
}
public void setBuilder(HouseBuilder builder) {
this.builder = builder;
}
/**
* 責控制產品對象的生產過程
*/
public House constructHouse() {
builder.buildBasic();
builder.buildWalls();
builder.buildFooled();
return builder.buildHouse();
}
}
調用
package com.neei.builder;
/**
* @param
* @Author: AaNeei
* @Date: 2019/9/25 22:29
* @Description: 遊學網
* @throws:
*/
public class Client {
public static void main(String[] args) {
HouseDirector director1 = new HouseDirector(new CommonHouse());
director1.constructHouse();
HouseDirector director2 = new HouseDirector(new HighHouse());
director2.constructHouse();
}
}
四,源碼分析
JDK源碼中使用的建造者模式,如java.lang.StringBuilder#append方法;