創建型 --- 生成器模式

      網友投稿 821 2022-05-30

      // 只有當產品較為復雜且需要詳細配置時,使用生成器模式才有意義。下面的兩個

      // 產品盡管沒有同樣的接口,但卻相互關聯。

      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小時內刪除侵權內容。

      上一篇:better-scroll插件的簡單使用
      下一篇:學習筆記:發布自己的python模塊安裝包
      相關文章
      亚洲国产精品无码中文字| 亚洲视频在线观看不卡| 亚洲精品美女视频| 亚洲va国产va天堂va久久| 久久久久亚洲爆乳少妇无| 亚洲国产精品自产在线播放| 一本色道久久88亚洲综合| 久久精品国产亚洲av麻豆蜜芽| 亚洲一区二区三区免费视频| 亚洲av永久无码嘿嘿嘿 | 久久精品国产亚洲AV不卡| 亚洲成a人片在线观看国产| 亚洲精品国产摄像头| 亚洲av中文无码字幕色不卡| 日韩色视频一区二区三区亚洲| 国产精品无码亚洲精品2021| 全亚洲最新黄色特级网站 | 国产成人高清亚洲一区久久| 亚洲成av人片在线观看天堂无码| 亚洲精品综合久久| 中文字幕亚洲一区二区三区| 亚洲欧洲自拍拍偷午夜色无码| 亚洲精品无码久久久久| 亚洲va中文字幕无码久久不卡| 亚洲成a人片在线观看中文动漫| 亚洲日本精品一区二区| 亚洲综合网美国十次| 精品久久久久久亚洲精品| 亚洲人成网站在线在线观看| 亚洲av成人片在线观看| 亚洲乱亚洲乱少妇无码| 亚洲精品午夜无码专区| 亚洲伊人tv综合网色| 亚洲综合小说久久另类区| 91在线亚洲综合在线| 日韩亚洲人成网站| 国产专区一va亚洲v天堂| 人人狠狠综合久久亚洲婷婷| 亚洲视频免费观看| 亚洲综合精品成人| 亚洲第一区在线观看|