比如在玩“極品飛車”這款游戲,那么每一關的地圖會千變萬化,簡單的來說,地圖會有晴天和陰天之分,那么創建地圖時就要根據晴天或者陰天來對地圖上的場景,比如:天空,樹,房子,和路面進行渲染,這個過程是一個固定的,每創建一個新地圖都要執行這幾個渲染,這是針對高級配置的電腦來說的。
現在擁有低配置電腦的人不在少數,那么他們就不能玩游戲了嗎?完全可以!只要將地圖中占用資源比較高的渲染去掉就可以,比如帶反射光影的樹,這時候需要創建不同的地圖,但地圖的創建過程卻是固定的,建造者模式完全可以應對這樣的情況。
【建造者模式解釋】
類型:創建模式
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
【建造者模式UML圖】
【建造者模式-JAVA代碼實現】
新建地圖接口:
package map_package; public interface map_interface { public void create_weather(); public void create_house(); public void create_tree(); public void create_way(); } |
新建晴天地圖類:
package map_package; public class map_sun implements map_interface { public void create_weather() { System.out.println("晴天"); } public void create_house() { System.out.println("房了上玻璃發亮"); } public void create_tree() { System.out.println("樹的顏色是淺綠色"); } public void create_way() { System.out.println("路面有些干燥"); } } |
新建陰天地圖類:
package map_package; public class map_cloudy implements map_interface{ public void create_weather() { System.out.println("陰天"); } public void create_house() { System.out.println("房了上玻璃發暗"); } public void create_tree() { System.out.println("樹的顏色是深綠色"); } public void create_way() { System.out.println("路面有些潮濕"); } } |
新建高畫質builder建造者類:
package map_build; import map_package.map_interface; public class map_build_adv { private map_interface map_interface_ref; public map_build_adv(map_interface map_interface_ref) { super(); this.map_interface_ref = map_interface_ref; } public void create_map() { System.out.println("創建一個高畫質的地圖"); // 創建的順序很重要 從天空往路面創建 map_interface_ref.create_weather(); map_interface_ref.create_house(); map_interface_ref.create_tree(); map_interface_ref.create_way(); } } |
新建低畫質builder建造者類:
package map_build; import map_package.map_interface; public class map_build_low { private map_interface map_interface_ref; public map_build_low(map_interface map_interface_ref) { super(); this.map_interface_ref = map_interface_ref; } public void create_map() { System.out.println("創建一個低畫質的地圖"); // 創建的順序很重要 從天空往路面創建 map_interface_ref.create_weather(); map_interface_ref.create_house(); // map_interface_ref.create_tree();將創建樹的過程去掉 map_interface_ref.create_way(); } } |
新建客戶端運行類:
package run_main; import map_build.map_build_adv; import map_build.map_build_low; import map_package.map_cloudy; import map_package.map_sun; public class run_main { public static void main(String[] args) { map_cloudy map_cloudy = new map_cloudy(); map_build_adv map_build_adv = new map_build_adv(map_cloudy); map_build_adv.create_map(); System.out.println(); map_sun map_sun = new map_sun(); map_build_low map_build_low = new map_build_low(map_sun); map_build_low.create_map(); } } |
程序運行結果如下:
創建一個高畫質的地圖 陰天 房了上玻璃發暗 樹的顏色是深綠色 路面有些潮濕 創建一個低畫質的地圖 晴天 房了上玻璃發亮 路面有些干燥 |
從程序中可以看到,建造者模式將不變的創建過程進行封裝,創建的過程與main分法進行分離,這樣內部的創建過程就和表示層的代碼進行分開,有利於創建過程功能上的修改。另外可以發現,代碼的設計和功能有些類似於facade外觀模式,區別在於,建造者模式目的在於以相同的構建過程通過不同的建造者得到不同的結果,而外觀模式並不需要不同的建造者,也不希望得到不同的結果,只是簡單的將幾個接口合並成高級的一個接口,不影響原有的結果,目的是使調用變得更加容易。
本程序中有2個建造者:高畫者建造者和低畫質建造者,它們都封裝了創建地圖的過程,這個過程很固定,但通過不同的建造者類可以返回不樣式的地圖,建造者規定了對象創建的過程,比如高畫質的建造者的創建過程為:
map_interface_ref.create_weather(); map_interface_ref.create_house(); map_interface_ref.create_tree(); map_interface_ref.create_way(); |
必須得執行4個方法才可以創建一個高畫質的地圖,如果不使用建造者模式,直接調用map類的create_xxxx方法,如果create_xxxx方法有幾十個,那么很有可能就把其中的某些方法忘記調用而影響最終地圖的效果了,所以我們要使用建造者模式來規定地圖創建的過程,這就是一個“行為守則”。