我的Java设计模式-建造者模式
在未上大學之前,一直有個夢想“I have a dream!”,就是能成為一位汽車工程師,一直幻想著開著自己設(shè)計的汽車飛奔在公路上,迷倒了萬千少女。咳咳~~雖然現(xiàn)在沒實現(xiàn)我的dream,但夢想還是得有的。
說到建造者模式,汽車絕對是典型的列子。汽車本身就是復雜產(chǎn)品對象,其制造過程可以形象的表示建造者模式。
一、建造者模式
定義
??將一個復雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
特點
??1.在某些屬性沒有賦值之前,復雜對象不能作為一個完整的產(chǎn)品使用。比如汽車包括方向盤、車門、發(fā)動機等各部件,缺少了這些部件就不能生產(chǎn)使用。
??2.對象的一些屬性必須按照順序賦值,比如汽車應(yīng)有車架才能裝車輪和其他部件。
UML
從上面的UML可以看出,建造者模式涉及到以下四個角色的概念:
??- 抽象建造者角色:提供一個接口,規(guī)范產(chǎn)品對象的建造,一般由子類實現(xiàn)。一般來說,產(chǎn)品的組成部分數(shù)與建造方法數(shù)相同,即有多少組成部分,就有多少個建造方法。
??- 具體建造者角色:該角色實現(xiàn)了抽象建造者抽象建造者接口,主要是實現(xiàn)所有聲明的方法以及返回建造好的產(chǎn)品實例。
??- 導演者角色:負責調(diào)用具體建造者按照順序建造產(chǎn)品。導演者只負責調(diào)度,真正執(zhí)行的是具體建造者角色。
??- 產(chǎn)品角色:該角色是建造的復雜對象,提供基本方法。
二、實戰(zhàn)
上代碼
現(xiàn)在要做兩輛萬眾矚目的豪車,一輛蘭博基尼,fine。另一輛法拉利,ok。一起來看看怎么造這兩臺車...
產(chǎn)品角色代碼如下:
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 {// 產(chǎn)品有多少個組件,就有多少個建造方法public void buildPart1();public void buildPart2();// 返回產(chǎn)品類 public Production build();}首先來看蘭博基尼怎么做,代碼如下:
public class BuilderA implements IBuilder {private Production production = new Production();@Overridepublic void buildPart1() {System.out.println("構(gòu)造蘭博基尼的第一部分。");production.setPart1("This is part1 of Lamborghini");}@Overridepublic void buildPart2() {System.out.println("構(gòu)造蘭博基尼的第二部分。");production.setPart2("This is part2 of Lamborghini");}@Overridepublic Production build() {System.out.println("咔擦!蘭博基尼已造好!");return production;} }導演者角色調(diào)度構(gòu)建,代碼如下:
public class Director {private IBuilder builder;public Director(IBuilder builder){this.builder = builder;}/*** 構(gòu)造順序*/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();}}運行客戶端代碼,結(jié)果如下:
構(gòu)造蘭博基尼的第一部分。
構(gòu)造蘭博基尼的第二部分。
咔擦!蘭博基尼已造好!
接下來要造法拉利了,步驟一樣,先實現(xiàn)抽象建造者接口。
法拉利具體建造者代碼如下:
public class BuilderB implements IBuilder {private Production production = new Production();@Overridepublic void buildPart1() {System.out.println("構(gòu)造法拉利的第一部分。");production.setPart1("This is part1 of Ferrari");}@Overridepublic void buildPart2() {System.out.println("構(gòu)造法拉利的第二部分。");production.setPart2("This is part2 of Ferrari");}@Overridepublic Production build() {return production;} }客戶端建造法拉利代碼如下:
public class Client {public static void main(String[] args) {// 法拉利IBuilder builderB = new BuilderB();Director directorB = new Director(builderB);directorB.construct();}}客戶端運行結(jié)果如下:
構(gòu)造法拉利的第一部分。
構(gòu)造法拉利的第二部分。
咻咻!法拉利已造好!
三、建造者模式的優(yōu)缺點
優(yōu)點
1)降低代碼耦合度。在建造者模式中,客戶端不需要知道產(chǎn)品內(nèi)部是如何實現(xiàn)的,我們只需得到產(chǎn)品的對象。并且使用導演者和建造者分離組裝過程和組件具體構(gòu)造過程,具有靈活的擴展性。
2)優(yōu)秀的擴展性。具體建造者相互獨立,方便擴展,符合開閉原則。
缺點
1)一定的使用范圍限制。建造者模式的產(chǎn)品的組件基本相同,如果產(chǎn)品的差異性較大,建造者模式就不適用了。
四、比較
跟工廠方法模式對比:建造者模式和工廠模式同樣是創(chuàng)建一個產(chǎn)品,工廠模式就是一個方法,而建造者模式有多個方法,并且建造者模式是有順序的執(zhí)行方法。就是說建造者模式強調(diào)的是順序,而工廠模式?jīng)]有順序一說。
總結(jié)
好了,蘭博基尼和法拉利的都擁有了,體驗了一會人生贏家的感覺。上一篇工廠模式跟建造者模式還是蠻相似的,有興趣可以翻看,斟酌兩種模式的不同之處,這個方式對學習設(shè)計模式幫助巨大。下一篇觀察者模式,敬請關(guān)注!
設(shè)計模式Java源碼GitHub下載:https://github.com/jetLee92/DesignPattern
轉(zhuǎn)載于:https://www.cnblogs.com/AndroidJet/p/7737609.html
總結(jié)
以上是生活随笔為你收集整理的我的Java设计模式-建造者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jspspy database help
- 下一篇: 人生不只是上坡路