一、建造者模式簡介
建造者模式可以將產品的構建過程與表示分離,UML圖如下:
二、代碼實現
在一個抽象類裏定義需要建議的東西,然後通過所有動作放在一個方法裏執行。
package com.atguigu.builder;
public abstract class AbstractHouse {
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void roofed();
public void build() {
buildBasic();
buildWalls();
roofed();
}
}
實現該抽象類:
package com.atguigu.builder;
public class CommonHouse extends AbstractHouse {
@Override
public void buildBasic() {
// TODO Auto-generated method stub
System.out.println(" 建地基");
}
@Override
public void buildWalls() {
// TODO Auto-generated method stub
System.out.println("建牆");
}
@Override
public void roofed() {
// TODO Auto-generated method stub
System.out.println("蓋瓦");
}
}
測試:
package com.atguigu.builder;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
CommonHouse commonHouse = new CommonHouse();
commonHouse.build();
}
}
三、 改進的建造者模式
建造者通過使用不同的builder類組裝不同的材料能夠建立出不同的產品(product),但生產的流程是一樣的。
1. 抽象Builder工具類,主要包含製造產品的對象和詳細的製造過程,定義一個HouseBuilder類,如果需要建造不同的產品,那麼就要繼承該Builder抽象類,生成不同的Builder工具。
package com.atguigu.builder.improve;
//builder
public abstract class HouseBuilder {
//構建的對象和方法過程
protected House house = new House();
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void roofed();
public House buildHouse() {
return house;
}
}
2. 產品類,產品類主要是包含生產該產品最後的實現結果,也是使用建造者模式後生成的結果,House代碼如下:
package com.atguigu.builder.improve;
//產品
public class House {
private String baise;
private String wall;
private String roofed;
public String getBaise() {
return baise;
}
public void setBaise(String baise) {
this.baise = 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;
}
}
3. 建造者,建造者需要builder才能生產產品,代碼如下:
package com.atguigu.builder.improve;
//建造者
public class HouseDirector {
HouseBuilder houseBuilder = null;
//需要工具來建造
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
// 提供對外初始化的builder
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//返回產品
public House constructHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.roofed();
return houseBuilder.buildHouse();
}
}
4. 具體的Builder類, 產品的不同實現需要不同的builder,比如我們要建一棟高樓,還要建一棟普通的房子,只不過是需要的材料不同而已。
高樓:
package com.atguigu.builder.improve;
//建高樓
public class HighBuilding extends HouseBuilder {
@Override
public void buildBasic() {
// TODO Auto-generated method stub
System.out.println("建造高房子的地基");
}
@Override
public void buildWalls() {
// TODO Auto-generated method stub
System.out.println("建造高房子的牆");
}
@Override
public void roofed() {
// TODO Auto-generated method stub
System.out.println("建造高房子的屋頂");
}
}
普通的房子:
package com.atguigu.builder.improve;
//建普通的房子
public class CommonHouse extends HouseBuilder {
@Override
public void buildBasic() {
// TODO Auto-generated method stub
System.out.println("建造普通房子的地基");
}
@Override
public void buildWalls() {
// TODO Auto-generated method stub
System.out.println("建造普通房子的牆");
}
@Override
public void roofed() {
// TODO Auto-generated method stub
System.out.println("建造普通房子的屋頂");
}
}
5. 測試類
package com.atguigu.builder.improve;
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();
//構造高樓的builder
houseDirector.setHouseBuilder(highBuilding);
//使用高樓的builder建高房子
houseDirector.constructHouse();
}
}