摘要:汽車本身就是復雜產品對象,其制造過程可以形象的表示建造者模式。另一輛法拉利,。法拉利具體建造者代碼如下構造法拉利的第一部分。咻咻法拉利已造好三建造者模式的優缺點優點降低代碼耦合度。
在未上大學之前,一直有個夢想“I have a dream!”,就是能成為一位汽車工程師,一直幻想著開著自己設計的汽車飛奔在公路上,迷倒了萬千少女。咳咳~~雖然現在沒實現我的dream,但夢想還是得有的。
說到建造者模式,汽車絕對是典型的列子。汽車本身就是復雜產品對象,其制造過程可以形象的表示建造者模式。
一、建造者模式 定義??將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
特點??1.在某些屬性沒有賦值之前,復雜對象不能作為一個完整的產品使用。比如汽車包括方向盤、車門、發動機等各部件,缺少了這些部件就不能生產使用。
??2.對象的一些屬性必須按照順序賦值,比如汽車應有車架才能裝車輪和其他部件。
UML從上面的UML可以看出,建造者模式涉及到以下四個角色的概念:
??- 抽象建造者角色:提供一個接口,規范產品對象的建造,一般由子類實現。一般來說,產品的組成部分數與建造方法數相同,即有多少組成部分,就有多少個建造方法。
??- 具體建造者角色:該角色實現了抽象建造者抽象建造者接口,主要是實現所有聲明的方法以及返回建造好的產品實例。
??- 導演者角色:負責調用具體建造者按照順序建造產品。導演者只負責調度,真正執行的是具體建造者角色。
??- 產品角色:該角色是建造的復雜對象,提供基本方法。
二、實戰 上代碼現在要做兩輛萬眾矚目的豪車,一輛蘭博基尼,fine。另一輛法拉利,ok。一起來看看怎么造這兩臺車...
產品角色代碼如下:
public class Production { private String part1; private String part2; public String getPart1() { return part1; } public void setPart1(String part1) { this.part1 = part1; } public String getPart2() { return part2; } public void setPart2(String part2) { this.part2 = part2; } }
抽象建造者角色代碼如下:
public interface IBuilder { // 產品有多少個組件,就有多少個建造方法 public void buildPart1(); public void buildPart2(); // 返回產品類 public Production build(); }
首先來看蘭博基尼怎么做,代碼如下:
public class BuilderA implements IBuilder { private Production production = new Production(); @Override public void buildPart1() { System.out.println("構造蘭博基尼的第一部分。"); production.setPart1("This is part1 of Lamborghini"); } @Override public void buildPart2() { System.out.println("構造蘭博基尼的第二部分。"); production.setPart2("This is part2 of Lamborghini"); } @Override public Production build() { System.out.println("咔擦!蘭博基尼已造好!"); return production; } }
導演者角色調度構建,代碼如下:
public class Director { private IBuilder builder; public Director(IBuilder builder){ this.builder = builder; } /** * 構造順序 */ public Production construct(){ builder.buildPart1(); builder.buildPart2(); return builder.build(); } }
下面看看客戶端如何使用建造者模式把蘭博基尼造出來,代碼如下:
public class Client { public static void main(String[] args){ // 蘭博基尼 IBuilder builderA = new BuilderA(); Director directorA = new Director(builderA); directorA.construct(); } }
運行客戶端代碼,結果如下:
構造蘭博基尼的第一部分。構造蘭博基尼的第二部分。
咔擦!蘭博基尼已造好!
接下來要造法拉利了,步驟一樣,先實現抽象建造者接口。
法拉利具體建造者代碼如下:
public class BuilderB implements IBuilder { private Production production = new Production(); @Override public void buildPart1() { System.out.println("構造法拉利的第一部分。"); production.setPart1("This is part1 of Ferrari"); } @Override public void buildPart2() { System.out.println("構造法拉利的第二部分。"); production.setPart2("This is part2 of Ferrari"); } @Override public Production build() { return production; } }
客戶端建造法拉利代碼如下:
public class Client { public static void main(String[] args) { // 法拉利 IBuilder builderB = new BuilderB(); Director directorB = new Director(builderB); directorB.construct(); } }
客戶端運行結果如下:
構造法拉利的第一部分。三、建造者模式的優缺點 優點構造法拉利的第二部分。
咻咻!法拉利已造好!
1)降低代碼耦合度。在建造者模式中,客戶端不需要知道產品內部是如何實現的,我們只需得到產品的對象。并且使用導演者和建造者分離組裝過程和組件具體構造過程,具有靈活的擴展性。
2)優秀的擴展性。具體建造者相互獨立,方便擴展,符合開閉原則。
缺點1)一定的使用范圍限制。建造者模式的產品的組件基本相同,如果產品的差異性較大,建造者模式就不適用了。
四、比較跟工廠方法模式對比:建造者模式和工廠模式同樣是創建一個產品,工廠模式就是一個方法,而建造者模式有多個方法,并且建造者模式是有順序的執行方法。就是說建造者模式強調的是順序,而工廠模式沒有順序一說。
總結好了,蘭博基尼和法拉利的都擁有了,體驗了一會人生贏家的感覺。上一篇工廠方法模式跟建造者模式還是蠻相似的,有興趣可以翻看,斟酌兩種模式的不同之處,這個方式對學習設計模式幫助巨大。下一篇觀察者模式,敬請關注!
設計模式Java源碼GitHub下載:https://github.com/jetLee92/DesignPattern
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67748.html
摘要:而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是通過組裝零配件而產生一個新產品。最后通過一個套餐實例,介紹了建造者模式在實例中的基本使用手段。 歷史文章回顧: 設計模式專欄 深入理解單例模式 深入理解工廠模式 歷史優質文章推薦: 分布式系統的經典基礎理論 可能是最漂亮的Spring事務管理詳解 面試中關于Java虛擬機(jvm)的問題看這篇就夠了 無論是在現實世界中還是在軟件...
摘要:建造者實現抽象類的所有未實現的方法,具體來說一般是兩項任務組建產品返回組建好的產品。 0x01.定義與類型 定義:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 用戶只需指定需要建造的類型就可以得到他們,建造過程及細節不需要知道 類型:創建型 實現建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...
摘要:建造者模式實現建造者模式實現創建抽象建造者類創建具體建造者類。建造者模式使用場景建造者模式使用場景相同的方法,不同的執行順序,產生不同的事件結果時,可以采用建造者模式。1、什么是建造者模式 Separate the construction of a complex object from its representation so that the same constructi...
1、什么是建造者模式Separate the construction of a complex object from its representation so that the same construction process can create different representations.將一個復雜對象的構建與它的表示分離, 使得同樣的構建過程可以創建不同的表示。 說人話:將構...
閱讀 3543·2021-09-22 15:50
閱讀 3241·2019-08-30 15:54
閱讀 2755·2019-08-30 14:12
閱讀 3064·2019-08-30 11:22
閱讀 2088·2019-08-29 11:16
閱讀 3583·2019-08-26 13:43
閱讀 1196·2019-08-23 18:33
閱讀 929·2019-08-23 18:32