創建型 --- 生成器模式
// 只有當產品較為復雜且需要詳細配置時,使用生成器模式才有意義。下面的兩個
// 產品盡管沒有同樣的接口,但卻相互關聯。
class Car is
// 一輛汽車可能配備有 GPS 設備、行車電腦和幾個座位。不同型號的汽車(
// 運動型轎車、 SUV 和敞篷車)可能會安裝或啟用不同的功能。
class Manual is
// 用戶使用手冊應該根據汽車配置進行編制,并介紹汽車的所有功能。
// 生成器接口聲明了創建產品對象不同部件的方法。
interface Builder is
method reset()
method setSeats(...)
method setEngine(...)
method setTripComputer(...)
method setGPS(...)
// 具體生成器類將遵循生成器接口并提供生成步驟的具體實現。你的程序中可能會
// 有多個以不同方式實現的生成器變體。
class CarBuilder implements Builder is
private field car:Car
// 一個新的生成器實例必須包含一個在后續組裝過程中使用的空產品對象。
constructor CarBuilder() is
this.reset()
// reset (重置)方法可清除正在生成的對象。
method reset() is
this.car = new Car()
// 所有生成步驟都會與同一個產品實例進行交互。
method setSeats(...) is
// 設置汽車座位的數量。
method setEngine(...) is
// 安裝指定的引擎。
method setTripComputer(...) is
// 安裝行車電腦。
method setGPS(...) is
// 安裝全球定位系統。
// 具體生成器需要自行提供獲取結果的方法。這是因為不同類型的生成器可能
// 會創建不遵循相同接口的、完全不同的產品。所以也就無法在生成器接口中
// 聲明這些方法(至少在靜態類型的編程語言中是這樣的)。
//
// 通常在生成器實例將結果返回給客戶端后,它們應該做好生成另一個產品的
// 準備。因此生成器實例通常會在 `getProduct (獲取產品) ` 方法主體末尾
// 調用重置方法。但是該行為并不是必需的,你也可讓生成器等待客戶端明確
// 調用重置方法后再去處理之前的結果。
method getProduct():Car is
product = this.car
this.reset()
return product
// 生成器與其他創建型模式的不同之處在于:它讓你能創建不遵循相同接口的產品。
class CarManualBuilder implements Builder is
private field manual:Manual
constructor CarManualBuilder() is
this.reset()
method reset() is
this.manual = new Manual()
method setSeats(...) is
// 添加關于汽車座椅功能的文檔。
method setEngine(...) is
// 添加關于引擎的介紹。
method setTripComputer(...) is
// 添加關于行車電腦的介紹。
method setGPS(...) is
// 添加關于 GPS 的介紹。
method getProduct():Manual is
// 返回使用手冊并重置生成器。
// 主管只負責按照特定順序執行生成步驟。其在根據特定步驟或配置來生成產品時
// 會很有幫助。由于客戶端可以直接控制生成器,所以嚴格意義上來說,主管類并
// 不是必需的。
class Director is
private field builder:Builder
// 主管可同由客戶端代碼傳遞給自身的任何生成器實例進行交互。客戶端可通
// 過這種方式改變最新組裝完畢的產品的最終類型。
method setBuilder(builder:Builder)
this.builder = builder
// 主管可使用同樣的生成步驟創建多個產品變體。
method constructSportsCar(builder: Builder) is
builder.reset()
builder.setSeats(2)
builder.setEngine(new SportEngine())
builder.setTripComputer(true)
builder.setGPS(true)
method constructSUV(builder: Builder) is
// ...
// 客戶端代碼會創建生成器對象并將其傳遞給主管,然后執行構造過程。最終結果
// 將需要從生成器對象中獲取。
class Application is
method makeCar() is
director = new Director()
CarBuilder builder = new CarBuilder()
director.constructSportsCar(builder)
Car car = builder.getProduct()
CarManualBuilder builder = new CarManualBuilder()
director.constructSportsCar(builder)
// 最終產品通常需要從生成器對象中獲取,因為主管不知曉具體生成器和
// 產品的存在,也不會對其產生依賴。
Manual manual = builder.getProduct()
交通智能體
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。