1.建房子問題
(1) 問題
- 建房子的過程:打樁、砌牆、封頂。
- 建的房子有這種各樣的,比如普通房、高樓、別墅,雖然他們的過程是一樣的,但是要求各不相同。
(2) 傳統方法實現
![在這裏插入圖片描述]()
public abstract class AbstractHouse{
public abstract void buildBasic();
public abstract void buildWall();
public abstract void roofed();
public void build(){
buildBasic();
buildWall();
roofed();
}
}
public class CommonHouse extends AbstractHouse{
@Override
public void buildBasic(){ sout("普通房子打地基中..."); }
@Override
public void buildWall(){ sout("普通房子砌牆中..."); }
@Override
public void roofed(){ sout("普通房子封頂中..."); }
}
public class doBuild(){
psvm(){
CommonHouse common = new CommonHous();
common.build();
}
}
(3) 優缺點
- 優點:簡單易操作
- 缺點:設計的程序結構,過於簡單,沒有設計緩存層對象,程序的拓展性和維護性不好。這種設計方案,把產品(房子)和創建產品的過程(建房子)封裝在一起,耦合性增強了。
- 將產品和產品建造的過程解耦 => 建造者模式
2.建造者模式
(1) 基本介紹
- 建造者模式,又叫生成器模式,是一種對象構建模式。它可以將複雜對象的建造過程抽象出來,是這個抽象過程的不同實現方式可以構造出不同表現(屬性)的對象。
- 建造者模式是一步一步創建一個複雜的對象,它允許用戶只通過指定複雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。
(2) 建造者模式的四個角色
- Product(產品角色):一個具體的產品對象。
- Builder(抽象建造者):創建一個Product對象的各個部件指定的接口或抽象類。主要負責描述、指定Product的建造各個步驟,但是具體的建造內部不需要實現。(注意這個角色不指定建造流程,流程由指揮者負責)
- ConcreteBuilder(具體建造者):繼承、實現抽象建造者,具體實現建造Product的各個部件。
- Director(指揮者):構建一個使用Builder接口/抽象類的對象。控制產品對象的生產過程。
![在這裏插入圖片描述]()
(3) 用建造者模式實現建房子
![在這裏插入圖片描述]()
public class House{
private String basic;
private String wall;
private String roofed;
getter&setter();
}
public abstract class HouseBuilder{
private House house = new House();
public abstract void buildBasic();
public abstract void buildWall();
public abstract void roofed();
public House getResult(){
return house;
}
}
public class CommonHouse extends AbstractHouse{
@Override
public void buildBasic(){
house.setBasic("地基5米");
sout("普通房子打地基中...");
}
@Override
public void buildWall(){
house.setWall("牆10釐米");
sout("普通房子砌牆中...");
}
@Override
public void roofed(){
house.setRoofed("屋頂10釐米");
sout("普通房子封頂中...");
}
}
public class HouseDirector{
private HouseBuilder houseBuilder;
public HouseDirector(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}
public House doBuild(){
houseBuilder.houseBuilder();
houseBuilder.buildWall();
houseBuilder.roofed();
return houseBuilder.getResult();
}
}
public class Do{
psvm(){
CommonHouse commonHouse = new CommonHouse();
HouseDirector doretor = new HouseDirector(commonHouse );
House house = doretor.doBuild();
}
}