成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Java設(shè)計(jì)模式之(三)——建造者模式

Forelax / 3601人閱讀

摘要:建造者模式實(shí)現(xiàn)建造者模式實(shí)現(xiàn)創(chuàng)建抽象建造者類(lèi)創(chuàng)建具體建造者類(lèi)。建造者模式使用場(chǎng)景建造者模式使用場(chǎng)景相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí),可以采用建造者模式。

1、什么是建造者模式

Separate the construction of a complex object from its representation so that the same construction process can create different representations.

將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離, 使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。

說(shuō)人話(huà):將構(gòu)造復(fù)雜對(duì)象的過(guò)程和組成對(duì)象的部件解耦。就像攢電腦一樣,不管什么品牌的配件,只要兼
容就可以裝上;同樣,一樣的配件,可以有好多組裝的方式。更直接點(diǎn)就是同一個(gè)類(lèi),通過(guò)內(nèi)部不同屬性狀態(tài)構(gòu)造不同的對(duì)象。

2、建造者模式定義

在建造者模式中,有 4 個(gè)定義:

①、Product(產(chǎn)品類(lèi)) :我們具體需要生成的類(lèi)對(duì)象

②、Builder(抽象建造者類(lèi)):為我們需要生成的類(lèi)對(duì)象,構(gòu)建不同的模塊屬性,即:公開(kāi)構(gòu)建產(chǎn)品類(lèi)的屬性,隱藏產(chǎn)品類(lèi)的其他功能。

③、ConcreteBuilder(具體建造者類(lèi)):實(shí)現(xiàn)抽象類(lèi)定義的所有方法,并返回一個(gè)組建好的對(duì)象。

④、Director(導(dǎo)演類(lèi)):確定構(gòu)建我們的類(lèi)對(duì)象具體有哪些模塊屬性,在實(shí)際應(yīng)用中可以不需要這個(gè)角色,直接通過(guò)client處理。

3、實(shí)例

比如我們?nèi)ベI(mǎi)車(chē),一般同一輛車(chē)會(huì)有多個(gè)版本,根據(jù)配置不一樣,分為經(jīng)典版、舒適版、豪華版等,比如經(jīng)典版是手動(dòng)擋手動(dòng)座椅,舒適版是自動(dòng)擋全景天窗等。

public class Car {    // 車(chē)名稱(chēng)    private String name;    // 自動(dòng)擋    private String automaticCatch;    // 手動(dòng)擋    private String manualTransmission;    // 全景天窗    private String panoramicSunroof;    // 自動(dòng)座椅    private String automaticSeat;    // 手動(dòng)座椅    private String manualSeat;    // 倒車(chē)影像    private String reversingImage;    //省略get/set方法}

3.1 普通實(shí)現(xiàn)

public class GeneralTest {    public Car getCarInstance(String carName){        Car car = new Car();        if("經(jīng)典版".equals(carName)){            car.setName("經(jīng)典版");            car.setManualTransmission("手動(dòng)擋");        }else if("舒適版".equals(carName)){            car.setName("舒適版");            car.setAutomaticCatch("自動(dòng)擋");            car.setManualSeat("手動(dòng)座椅");        }else if("豪華版".equals(carName)){            car.setName("豪華版");            car.setAutomaticCatch("自動(dòng)擋");            car.setAutomaticSeat("自動(dòng)座椅");            car.setReversingImage("倒車(chē)影像");            car.setPanoramicSunroof("全景天窗");        }else{            throw new IllegalArgumentException("carName is error: carName="+carName);        }        return car;    }}

注意,并不是說(shuō)高版本汽車(chē)一定具有低版本所有配置,比如舒適版配置是手動(dòng)座椅,豪華版是自動(dòng)座椅,而且不同版本之間配置有交叉。

從上面可以看出,根據(jù)汽車(chē)類(lèi)型,我們可以創(chuàng)建相應(yīng)配置的汽車(chē),但其實(shí)汽車(chē)的配置是有很多的,種類(lèi)一旦多了,上面的代碼就會(huì)顯得很臃腫,也不好維護(hù),于是我們用建造者模式來(lái)重構(gòu)。

3.2 建造者模式實(shí)現(xiàn)

①、創(chuàng)建抽象建造者類(lèi)

public abstract class CarBuilder {    public abstract Car buildClassic();    public abstract Car buildComfortable();    public abstract Car buildLuxury();}

②、創(chuàng)建具體建造者類(lèi)。對(duì)抽象建造者類(lèi)的抽象方法進(jìn)行實(shí)現(xiàn)賦值,達(dá)到我們所需要的結(jié)果。

public class CarConcreteBuilder extends CarBuilder{    @Override    public Car buildClassic() {        Car car = new Car();        car.setName("經(jīng)典版");        car.setManualTransmission("手動(dòng)擋");        return car;    }    @Override    public Car buildComfortable() {        Car car = new Car();        car.setName("舒適版");        car.setAutomaticCatch("自動(dòng)擋");        car.setManualSeat("手動(dòng)座椅");        return car;    }    @Override    public Car buildLuxury() {        Car car = new Car();        car.setName("豪華版");        car.setAutomaticCatch("自動(dòng)擋");        car.setAutomaticSeat("自動(dòng)座椅");        car.setReversingImage("倒車(chē)影像");        car.setPanoramicSunroof("全景天窗");        return car;    }}

③、創(chuàng)建我們的導(dǎo)演類(lèi),指導(dǎo)我們?cè)趺慈?chuàng)建對(duì)象

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();    }}

④、測(cè)試

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);    }}

另外,對(duì)于不同配置之間有互斥關(guān)系,比如有了手動(dòng)擋,就不可能有自動(dòng)擋,屬性之間的關(guān)系我們也可以在具體建造者類(lèi) CarConcreteBuilder 進(jìn)行設(shè)置。

4、與工廠模式區(qū)別

前面我們介紹工廠模式時(shí)說(shuō)了由工廠類(lèi)來(lái)負(fù)責(zé)創(chuàng)建對(duì)象,而建造者模式也是讓具體建造者類(lèi)負(fù)責(zé)創(chuàng)建對(duì)象,那這兩者有什么區(qū)別呢?

實(shí)際上工廠模式是用來(lái)創(chuàng)建不同但是相關(guān)類(lèi)型的對(duì)象(繼承同一父類(lèi)或者接口的一組子類(lèi)),由給定的參數(shù)來(lái)決定創(chuàng)建哪種類(lèi)型的對(duì)象。而建造者模式是用來(lái)創(chuàng)建一種類(lèi)型的復(fù)雜對(duì)象,通過(guò)設(shè)置不同的可選參數(shù),“定制化”地創(chuàng)建不同的對(duì)象。

有這樣一個(gè)例子可以形象的解釋?zhuān)?/p>

顧客走進(jìn)一家餐館點(diǎn)餐,我們利用工廠模式,根據(jù)用戶(hù)不同的選擇,來(lái)制作不同的食物,比如披薩、漢堡、沙拉。對(duì)于披薩來(lái)說(shuō),用戶(hù)又有各種配料可以定制,比如奶酪、西紅柿、起司,我們通過(guò)建造者模式根據(jù)用戶(hù)選擇的不同配料來(lái)制作披薩。

5、建造者模式優(yōu)點(diǎn)

①、封裝性

使用建造者模式可以使客戶(hù)端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié), 如例子中我們就不需要關(guān)心每一種版本汽車(chē)內(nèi)部是如何實(shí)現(xiàn)的, 產(chǎn)生的對(duì)象類(lèi)型就是Car。

②、建造者獨(dú)立,容易擴(kuò)展

其實(shí)對(duì)于上面例子中的 CarConcreteBuilder 類(lèi),有三個(gè)方法,分別構(gòu)造經(jīng)典版、舒適版、豪華版汽車(chē),每個(gè)方法內(nèi)部是不受影響的,或者我們還可以直接把這一個(gè)類(lèi)拆成三個(gè)類(lèi)。

③、便于控制細(xì)節(jié)風(fēng)險(xiǎn)

由于具體每個(gè)建造者過(guò)程是獨(dú)立的,因此可以對(duì)過(guò)程更加細(xì)化,而不會(huì)對(duì)其它模塊產(chǎn)生影響。

6、建造者模式使用場(chǎng)景

①、相同的方法, 不同的執(zhí)行順序, 產(chǎn)生不同的事件結(jié)果時(shí), 可以采用建造者模式。

②、多個(gè)部件或零件, 都可以裝配到一個(gè)對(duì)象中, 但是產(chǎn)生的運(yùn)行結(jié)果又不相同時(shí), 則可以使用該模式。

③、產(chǎn)品類(lèi)非常復(fù)雜, 或者產(chǎn)品類(lèi)中的調(diào)用順序不同產(chǎn)生了不同的效能, 這個(gè)時(shí)候使用建造者模式非常合適。

作者:IT可樂(lè)
出處:http://www.cnblogs.com/ysocean/

資源:微信搜【IT可樂(lè)】關(guān)注我,回復(fù) 【電子書(shū)】有我特別篩選的免費(fèi)電子書(shū)。
本文版權(quán)歸作者所有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意不能轉(zhuǎn)載,否則保留追究法律責(zé)任的權(quán)利。
?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/123991.html

相關(guān)文章

  • #yyds干貨盤(pán)點(diǎn)#Java設(shè)計(jì)模式)——建造模式

    1、什么是建造者模式Separate the construction of a complex object from its representation so that the same construction process can create different representations.將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離, 使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。 說(shuō)人話(huà):將構(gòu)...

    番茄西紅柿 評(píng)論0 收藏2637
  • 我的Java設(shè)計(jì)模式-建造模式

    摘要:汽車(chē)本身就是復(fù)雜產(chǎn)品對(duì)象,其制造過(guò)程可以形象的表示建造者模式。另一輛法拉利,。法拉利具體建造者代碼如下構(gòu)造法拉利的第一部分。咻咻法拉利已造好三建造者模式的優(yōu)缺點(diǎn)優(yōu)點(diǎn)降低代碼耦合度。 在未上大學(xué)之前,一直有個(gè)夢(mèng)想I have a dream!,就是能成為一位汽車(chē)工程師,一直幻想著開(kāi)著自己設(shè)計(jì)的汽車(chē)飛奔在公路上,迷倒了萬(wàn)千少女??瓤葉~雖然現(xiàn)在沒(méi)實(shí)現(xiàn)我的dream,但夢(mèng)想還是得有的。 說(shuō)到...

    elisa.yang 評(píng)論0 收藏0
  • 設(shè)計(jì)模式建造模式

    摘要:建造者實(shí)現(xiàn)抽象類(lèi)的所有未實(shí)現(xiàn)的方法,具體來(lái)說(shuō)一般是兩項(xiàng)任務(wù)組建產(chǎn)品返回組建好的產(chǎn)品。 0x01.定義與類(lèi)型 定義:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。 用戶(hù)只需指定需要建造的類(lèi)型就可以得到他們,建造過(guò)程及細(xì)節(jié)不需要知道 類(lèi)型:創(chuàng)建型 實(shí)現(xiàn)建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...

    banana_pi 評(píng)論0 收藏0
  • 深入理解建造模式 ——組裝復(fù)雜的實(shí)例

    摘要:而建造者模式則是要求按照指定的藍(lán)圖建造產(chǎn)品,它的主要目的是通過(guò)組裝零配件而產(chǎn)生一個(gè)新產(chǎn)品。最后通過(guò)一個(gè)套餐實(shí)例,介紹了建造者模式在實(shí)例中的基本使用手段。 歷史文章回顧: 設(shè)計(jì)模式專(zhuān)欄 深入理解單例模式 深入理解工廠模式 歷史優(yōu)質(zhì)文章推薦: 分布式系統(tǒng)的經(jīng)典基礎(chǔ)理論 可能是最漂亮的Spring事務(wù)管理詳解 面試中關(guān)于Java虛擬機(jī)(jvm)的問(wèn)題看這篇就夠了 無(wú)論是在現(xiàn)實(shí)世界中還是在軟件...

    sanyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Forelax

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<