摘要:建造者模式實現建造者模式實現創建抽象建造者類創建具體建造者類。建造者模式使用場景建造者模式使用場景相同的方法,不同的執行順序,產生不同的事件結果時,可以采用建造者模式。
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
將一個復雜對象的構建與它的表示分離, 使得同樣的構建過程可以創建不同的表示。
說人話:將構造復雜對象的過程和組成對象的部件解耦。就像攢電腦一樣,不管什么品牌的配件,只要兼
容就可以裝上;同樣,一樣的配件,可以有好多組裝的方式。更直接點就是同一個類,通過內部不同屬性狀態構造不同的對象。
在建造者模式中,有 4 個定義:
①、Product(產品類) :我們具體需要生成的類對象
②、Builder(抽象建造者類):為我們需要生成的類對象,構建不同的模塊屬性,即:公開構建產品類的屬性,隱藏產品類的其他功能。
③、ConcreteBuilder(具體建造者類):實現抽象類定義的所有方法,并返回一個組建好的對象。
④、Director(導演類):確定構建我們的類對象具體有哪些模塊屬性,在實際應用中可以不需要這個角色,直接通過client處理。
比如我們去買車,一般同一輛車會有多個版本,根據配置不一樣,分為經典版、舒適版、豪華版等,比如經典版是手動擋手動座椅,舒適版是自動擋全景天窗等。
public class Car { // 車名稱 private String name; // 自動擋 private String automaticCatch; // 手動擋 private String manualTransmission; // 全景天窗 private String panoramicSunroof; // 自動座椅 private String automaticSeat; // 手動座椅 private String manualSeat; // 倒車影像 private String reversingImage; //省略get/set方法}
public class GeneralTest { public Car getCarInstance(String carName){ Car car = new Car(); if("經典版".equals(carName)){ car.setName("經典版"); car.setManualTransmission("手動擋"); }else if("舒適版".equals(carName)){ car.setName("舒適版"); car.setAutomaticCatch("自動擋"); car.setManualSeat("手動座椅"); }else if("豪華版".equals(carName)){ car.setName("豪華版"); car.setAutomaticCatch("自動擋"); car.setAutomaticSeat("自動座椅"); car.setReversingImage("倒車影像"); car.setPanoramicSunroof("全景天窗"); }else{ throw new IllegalArgumentException("carName is error: carName="+carName); } return car; }}
注意,并不是說高版本汽車一定具有低版本所有配置,比如舒適版配置是手動座椅,豪華版是自動座椅,而且不同版本之間配置有交叉。
從上面可以看出,根據汽車類型,我們可以創建相應配置的汽車,但其實汽車的配置是有很多的,種類一旦多了,上面的代碼就會顯得很臃腫,也不好維護,于是我們用建造者模式來重構。
①、創建抽象建造者類
public abstract class CarBuilder { public abstract Car buildClassic(); public abstract Car buildComfortable(); public abstract Car buildLuxury();}
②、創建具體建造者類。對抽象建造者類的抽象方法進行實現賦值,達到我們所需要的結果。
public class CarConcreteBuilder extends CarBuilder{ @Override public Car buildClassic() { Car car = new Car(); car.setName("經典版"); car.setManualTransmission("手動擋"); return car; } @Override public Car buildComfortable() { Car car = new Car(); car.setName("舒適版"); car.setAutomaticCatch("自動擋"); car.setManualSeat("手動座椅"); return car; } @Override public Car buildLuxury() { Car car = new Car(); car.setName("豪華版"); car.setAutomaticCatch("自動擋"); car.setAutomaticSeat("自動座椅"); car.setReversingImage("倒車影像"); car.setPanoramicSunroof("全景天窗"); return car; }}
③、創建我們的導演類,指導我們怎么去創建對象
public class CarDirector { private CarBuilder carBuilder; public CarDirector(CarBuilder carBuilder){ this.carBuilder = carBuilder; } public Car classicConstruct(){ return carBuilder.buildClassic(); } public Car comfortableConstruct(){ return carBuilder.buildComfortable(); } public Car luxuryConstruct(){ return carBuilder.buildLuxury(); }}
④、測試
public class BuilderTest { public static void main(String[] args) { CarBuilder carBuilder = new CarConcreteBuilder(); CarDirector carDirector = new CarDirector(carBuilder); Car classicCar = carDirector.classicConstruct(); System.out.println(classicCar); Car comfortableCar = carDirector.comfortableConstruct(); System.out.println(comfortableCar); }}
另外,對于不同配置之間有互斥關系,比如有了手動擋,就不可能有自動擋,屬性之間的關系我們也可以在具體建造者類 CarConcreteBuilder 進行設置。
前面我們介紹工廠模式時說了由工廠類來負責創建對象,而建造者模式也是讓具體建造者類負責創建對象,那這兩者有什么區別呢?
實際上工廠模式是用來創建不同但是相關類型的對象(繼承同一父類或者接口的一組子類),由給定的參數來決定創建哪種類型的對象。而建造者模式是用來創建一種類型的復雜對象,通過設置不同的可選參數,“定制化”地創建不同的對象。
有這樣一個例子可以形象的解釋:
顧客走進一家餐館點餐,我們利用工廠模式,根據用戶不同的選擇,來制作不同的食物,比如披薩、漢堡、沙拉。對于披薩來說,用戶又有各種配料可以定制,比如奶酪、西紅柿、起司,我們通過建造者模式根據用戶選擇的不同配料來制作披薩。
①、封裝性
使用建造者模式可以使客戶端不必知道產品內部組成的細節, 如例子中我們就不需要關心每一種版本汽車內部是如何實現的, 產生的對象類型就是Car。
②、建造者獨立,容易擴展
其實對于上面例子中的 CarConcreteBuilder 類,有三個方法,分別構造經典版、舒適版、豪華版汽車,每個方法內部是不受影響的,或者我們還可以直接把這一個類拆成三個類。
③、便于控制細節風險
由于具體每個建造者過程是獨立的,因此可以對過程更加細化,而不會對其它模塊產生影響。
①、相同的方法, 不同的執行順序, 產生不同的事件結果時, 可以采用建造者模式。
②、多個部件或零件, 都可以裝配到一個對象中, 但是產生的運行結果又不相同時, 則可以使用該模式。
③、產品類非常復雜, 或者產品類中的調用順序不同產生了不同的效能, 這個時候使用建造者模式非常合適。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123991.html
1、什么是建造者模式Separate the construction of a complex object from its representation so that the same construction process can create different representations.將一個復雜對象的構建與它的表示分離, 使得同樣的構建過程可以創建不同的表示。 說人話:將構...
摘要:汽車本身就是復雜產品對象,其制造過程可以形象的表示建造者模式。另一輛法拉利,。法拉利具體建造者代碼如下構造法拉利的第一部分。咻咻法拉利已造好三建造者模式的優缺點優點降低代碼耦合度。 在未上大學之前,一直有個夢想I have a dream!,就是能成為一位汽車工程師,一直幻想著開著自己設計的汽車飛奔在公路上,迷倒了萬千少女??瓤葉~雖然現在沒實現我的dream,但夢想還是得有的。 說到...
摘要:建造者實現抽象類的所有未實現的方法,具體來說一般是兩項任務組建產品返回組建好的產品。 0x01.定義與類型 定義:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 用戶只需指定需要建造的類型就可以得到他們,建造過程及細節不需要知道 類型:創建型 實現建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...
摘要:而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是通過組裝零配件而產生一個新產品。最后通過一個套餐實例,介紹了建造者模式在實例中的基本使用手段。 歷史文章回顧: 設計模式專欄 深入理解單例模式 深入理解工廠模式 歷史優質文章推薦: 分布式系統的經典基礎理論 可能是最漂亮的Spring事務管理詳解 面試中關于Java虛擬機(jvm)的問題看這篇就夠了 無論是在現實世界中還是在軟件...
閱讀 1249·2023-04-26 02:38
閱讀 928·2023-04-25 20:13
閱讀 3589·2021-11-19 11:31
閱讀 2396·2019-08-30 15:55
閱讀 2717·2019-08-30 14:11
閱讀 3157·2019-08-30 13:45
閱讀 1371·2019-08-29 18:41
閱讀 1147·2019-08-29 16:18