文章目錄
- 引例
- 一般解法
- 建造者模式
- 建造者模式解法
- 總結
引例
廢話不多說,引出需求,
需求:建造房子,建造程序包括打地基、砌墻和封頂,房子各式各樣,包括平房和別墅,編程模擬實作,

一般解法
思路:定義房子類,包括建房的方法,然后定義平房和別墅繼承房子類,重寫相關方法,
類圖:

代碼:
- AbstractHouse(房子)
public abstract class AbstractHouse {
public abstract void buildBasic();//打地基
public abstract void buildWalls();//砌墻
public abstract void buildRoof();//封頂
public void build() { //建房
buildBasic(); //三個步驟(注意順序)
buildWalls();
buildRoof();
}
}
- Bungalow(平房)
public class Bungalow extends AbstractHouse{
@Override
public void buildBasic() {
System.out.println("平房打地基");
}
@Override
public void buildWalls() {
System.out.println("平房砌墻");
}
@Override
public void buildRoof() {
System.out.println("平房封頂");
}
}
- Villa (別墅)
public class Villa extends AbstractHouse{
@Override
public void buildBasic() {
System.out.println("別墅打地基");
}
@Override
public void buildWalls() {
System.out.println("別墅砌墻");
}
@Override
public void buildRoof() {
System.out.println("別墅封頂");
}
}
- 客戶端呼叫
public class Client {
public static void main(String[] args) {
Bungalow bungalow = new Bungalow();
bungalow.build();
Villa villa = new Villa();
villa.build();
}
}
運行結果:

缺點:
程式不好擴展和維護,把產品和創建產品程序封裝在一起,耦合性高,
解耦產品和創建產品程序=》建造者模式
建造者模式
建造者模式(Builder Pattern)又叫生成器模式,是一種物件構建模式,它可以將復雜物件的建造程序抽象出來(抽象類別),使這個抽象程序的不同實作方法可以構造出不同表現(屬性)的物件,
一步一步創建一個復雜的物件,允許用戶只通過指定復雜物件的型別和內容就可以構建它們,而不需要知道內部的具體構建細節,
類圖:

- Product(產品): 具體的產品物件
- Builder(抽象建造者): 創建一個產品物件的各個部件指定的介面/抽象類,
- ConcreteBuilder(具體建造者): 實作介面,構建和裝配各個部件,
- Director(指揮者): 構建一個使用Builder介面的物件,負責控制產品物件的生產程序,隔離了客戶與物件的生產程序,
(
插播反爬資訊)博主CSDN地址:https://wzlodq.blog.csdn.net/
建造者模式解法
代碼:
- House類(Product產品)
public class House {
private String baise;
private String wall;
private String roof;
}
- HouseBuilder類(Builder抽象建造者)
public abstract class HouseBuilder {
protected House house = new House();
//將建造的流程寫好, 抽象的方法
public abstract void buildBasic();
public abstract void buildWalls();
public abstract void buildRoof();
//建造房子好, 將產品(房子) 回傳
public House buildHouse() {
return house;
}
}
3.Bungalow類(ConcreteBuilder具體建造者A)
public class Bungalow extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("平房打地基");
}
@Override
public void buildWalls() {
System.out.println("平房砌墻");
}
@Override
public void buildRoof() {
System.out.println("平房封頂");
}
}
4.Villa類(ConcreteBuilder具體建造者B)
public class Villa extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("別墅打地基");
}
@Override
public void buildWalls() {
System.out.println("別墅砌墻");
}
@Override
public void buildRoof() {
System.out.println("別墅封頂");
}
}
5.HouseDirector類(Director指揮者)
public class HouseDirector {
HouseBuilder houseBuilder = null;
//構造器傳入 houseBuilder
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//通過setter 傳入 houseBuilder
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
//如何處理建造房子的流程,交給指揮者
public House constructHouse() {
houseBuilder.buildBasic();
houseBuilder.buildWalls();
houseBuilder.buildRoof();
return houseBuilder.buildHouse();
}
}
- 客戶端呼叫
public class Client {
public static void main(String[] args) {
//蓋平房
Bungalow commonHouse = new Bungalow();
//準備創建房子的指揮者
HouseDirector houseDirector = new HouseDirector(commonHouse);
//完成蓋房子,回傳產品(普通房子)
House house = houseDirector.constructHouse();
System.out.println("--------------------------");
//蓋別墅
Villa highBuilding = new Villa();
//重置建造者
houseDirector.setHouseBuilder(highBuilding);
//完成蓋房子,回傳產品(高樓)
houseDirector.constructHouse();
}
}
運行結果:

總結
- 客戶端不必知道產品內部組成的細節,將產品本身與產品的創建程序解耦,使得相同的創建程序可以創建不同的產品物件,
- 將復雜產品的創建步驟分解在不同的方法中,使得創建程序更加清晰,
- 使用不同的具體建造者即可得到不同的產品物件,
- 增加新的具體建造者無須修改原有代碼,
- 若產品間的差異很大,則不適合使用建造者模式,
- 抽象工廠模式VS建造者模式
抽象工廠模式是對產品家族的創建,一個產品家族是一系列產品:具有不同分類維度的產品組合,采用抽象工廠模式不需要關心構建程序,只關心什么產品由什么工廠生產即可,
而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是通過組裝零配件而產生一個新產品,
原創不易,請勿轉載(
本不富裕的訪問量雪上加霜)
博主首頁:https://wzlodq.blog.csdn.net/
微信公眾號:唔仄lo咚鏘
如果文章對你有幫助,記得一鍵三連?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257879.html
標籤:java
