摘要:在建造者模式比較龐大時(shí),導(dǎo)演類可以有多個(gè)。該種場(chǎng)景只能是一個(gè)補(bǔ)償方法,因?yàn)橐粋€(gè)對(duì)象不容易獲得,而在設(shè)計(jì)階段竟然沒有發(fā)覺,而要通過創(chuàng)建者模式柔化創(chuàng)建過程,本身已經(jīng)違反設(shè)計(jì)的最初目標(biāo)。源碼地址參考文獻(xiàn)設(shè)計(jì)模式之禪
定義
Separate the construction of a complex object from its representation so that the sameconstruction process can create different representations.實(shí)現(xiàn) 產(chǎn)品類將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
由多個(gè)部件組成
public class Product { private String partA; private String partB; public String getPartA() { return partA; } public void setPartA(String partA) { this.partA = partA; } public String getPartB() { return partB; } public void setPartB(String partB) { this.partB = partB; } @Override public String toString() { return "partA:" + partA + ", partB:" + partB; } }抽象建造者
規(guī)范產(chǎn)品的組建,一般是由子類實(shí)現(xiàn)。其中,buildPart方法是零件的配置,設(shè)置一個(gè)不同零件,或者不同的裝配順序就可能產(chǎn)生不同的產(chǎn)品。
public abstract class Builder { /** * 設(shè)置產(chǎn)品的不同組件/零件,以獲得不同的產(chǎn)品 */ public abstract void buildPartA(); /** * 設(shè)置產(chǎn)品的不同組件/零件,以獲得不同的產(chǎn)品 */ public abstract void buildPartB(); /** * 建造產(chǎn)品 * @return */ public abstract Product getProduct(); }具體建造者
實(shí)現(xiàn)抽象類定義的所有方法,并且返回一個(gè)組建好的對(duì)象
public class ConcreteBuilder1 extends Builder { private Product product = new Product(); @Override public void buildPartA() { System.out.println("ConcreteBuilder1->buildPartA()"); product.setPartA("組件A1"); } @Override public void buildPartB() { System.out.println("ConcreteBuilder1->buildPartB()"); product.setPartB("組件B1"); } @Override public Product getProduct() { System.out.println("ConcreteBuilder1->getProduct()"); return product; } }
public class ConcreteBuilder2 extends Builder { private Product product = new Product(); @Override public void buildPartA() { System.out.println("ConcreteBuilder2->buildPartA()"); product.setPartA("組件A2"); } @Override public void buildPartB() { System.out.println("ConcreteBuilder2->buildPartB()"); product.setPartB("組件B2"); } @Override public Product getProduct() { System.out.println("ConcreteBuilder2->getProduct()"); return product; } }導(dǎo)演類
也叫指揮者類,負(fù)責(zé)安排已有模塊的順序,然后告訴Builder開始建造。導(dǎo)演類起到封裝的作用,避免高層模塊深入到建造者內(nèi)部的實(shí)現(xiàn)類。在建造者模式比較龐大時(shí),導(dǎo)演類可以有多個(gè)。
public class Director { private Builder builder; public Director(Builder builder){ this.builder = builder; } /** * 將部件partA、partB...最后組成復(fù)雜對(duì)象(使用多個(gè)簡(jiǎn)單的對(duì)象一步一步構(gòu)建成一個(gè)復(fù)雜的對(duì)象) */ public void construct(){ builder.buildPartA(); builder.buildPartB(); } }客戶端代碼
public class Client { public static void main(String[] args) { Builder builder1 = new ConcreteBuilder1(); Director director1 = new Director(builder1); director1.construct(); Product product1 = builder1.getProduct(); System.out.println(product1); Builder builder2 = new ConcreteBuilder2(); Director director2 = new Director(builder2); director2.construct(); Product product2 = builder2.getProduct(); System.out.println(product2); } }優(yōu)點(diǎn)
封裝性
客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)
建造者獨(dú)立,容易擴(kuò)展
便于控制細(xì)節(jié)風(fēng)險(xiǎn)
由于具體的建造者是獨(dú)立的,因此可以對(duì)建造過程逐步細(xì)化,而不對(duì)其他的模塊產(chǎn)生任何影響
使用場(chǎng)景相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí),可以采用建造者模式。
多個(gè)部件或零件,都可以裝配到一個(gè)對(duì)象中,但是產(chǎn)生的運(yùn)行結(jié)果又不相同時(shí),則可以使用該模式。
產(chǎn)品類非常復(fù)雜,或者產(chǎn)品類中的調(diào)用順序不同產(chǎn)生了不同的效能,這個(gè)時(shí)候使用建造者模式非常合適。
在對(duì)象創(chuàng)建過程中會(huì)使用到系統(tǒng)中的一些其他對(duì)象,這些對(duì)象在產(chǎn)品對(duì)象的創(chuàng)建過程中不易得到時(shí),也可以采用建造者模式封裝該對(duì)象的創(chuàng)建過程。
該種場(chǎng)景只能是一個(gè)補(bǔ)償方法,因?yàn)橐粋€(gè)對(duì)象不容易獲得,而在設(shè)計(jì)階段竟然沒有發(fā)覺,而要通過創(chuàng)建者模式柔化創(chuàng)建過程,本身已經(jīng)違反設(shè)計(jì)的最初目標(biāo)。擴(kuò)展
除上面的通用源碼實(shí)現(xiàn)外,還有另外一種更為常見的場(chǎng)景,就是當(dāng)一個(gè)類構(gòu)造器需要傳入很多參數(shù)時(shí),并且通常有一部分參數(shù)是可選的,如果使用構(gòu)造方法創(chuàng)建這個(gè)類的實(shí)例,代碼可讀性會(huì)非常差,而且很容易引入錯(cuò)誤,此時(shí)就可以利用 builder模式:
public class Person { private final String cardId; private final String name; private final Integer age; private final String sex; private final String address; public static class Builder { // 必須的參數(shù) private final String cardId; private final String name; // 可選的參數(shù) private Integer age; private String sex; private String address; public Builder(String cardId, String name) { this.cardId = cardId; this.name = name; } public Builder age(Integer age) { this.age = age; return this; } public Builder sex(String sex) { this.sex = sex; return this; } public Builder address(String address) { this.address = address; return this; } public Person build() { return new Person(this); } } private Person(Builder builder) { this.cardId = builder.cardId; this.name = builder.name; this.age = builder.age; this.sex = builder.sex; this.address = builder.address; } @Override public String toString() { return "cardId:" + cardId + ",name:" + name + ",age:" + age + ",sex:" + sex + ",address:" + address; } }
public class Client { public static void main(String[] args) { Person zhangsan = new Person.Builder("100000000000000000", "張三") .age(28) .sex("MALE") .address("BJ") .build(); System.out.println(zhangsan); Person lisi = new Person.Builder("100000000000000001", "李四") .address("TJ") .build(); System.out.println(lisi); } }
上面的代碼通過Person的內(nèi)部類Builder創(chuàng)建一個(gè)Person實(shí)例,其中,李四對(duì)年齡和性別進(jìn)行了”保密“(age和sex均為可選參數(shù))。可以看到,代碼看起來更為優(yōu)雅,大大增強(qiáng)了可讀性,并且客戶端代碼也更容易編寫。
源碼地址:https://gitee.com/tianranll/j...
參考文獻(xiàn):《設(shè)計(jì)模式之禪》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75162.html
摘要:建造者實(shí)現(xiàn)抽象類的所有未實(shí)現(xiàn)的方法,具體來說一般是兩項(xiàng)任務(wù)組建產(chǎn)品返回組建好的產(chǎn)品。 0x01.定義與類型 定義:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 用戶只需指定需要建造的類型就可以得到他們,建造過程及細(xì)節(jié)不需要知道 類型:創(chuàng)建型 實(shí)現(xiàn)建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...
摘要:汽車本身就是復(fù)雜產(chǎn)品對(duì)象,其制造過程可以形象的表示建造者模式。另一輛法拉利,。法拉利具體建造者代碼如下構(gòu)造法拉利的第一部分。咻咻法拉利已造好三建造者模式的優(yōu)缺點(diǎn)優(yōu)點(diǎn)降低代碼耦合度。 在未上大學(xué)之前,一直有個(gè)夢(mèng)想I have a dream!,就是能成為一位汽車工程師,一直幻想著開著自己設(shè)計(jì)的汽車飛奔在公路上,迷倒了萬千少女。咳咳~~雖然現(xiàn)在沒實(shí)現(xiàn)我的dream,但夢(mèng)想還是得有的。 說到...
摘要:建造者模式實(shí)現(xiàn)建造者模式實(shí)現(xiàn)創(chuàng)建抽象建造者類創(chuàng)建具體建造者類。建造者模式使用場(chǎng)景建造者模式使用場(chǎng)景相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí),可以采用建造者模式。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.將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離, 使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 說人話:將構(gòu)...
摘要:而建造者模式則是要求按照指定的藍(lán)圖建造產(chǎn)品,它的主要目的是通過組裝零配件而產(chǎn)生一個(gè)新產(chǎn)品。最后通過一個(gè)套餐實(shí)例,介紹了建造者模式在實(shí)例中的基本使用手段。 歷史文章回顧: 設(shè)計(jì)模式專欄 深入理解單例模式 深入理解工廠模式 歷史優(yōu)質(zhì)文章推薦: 分布式系統(tǒng)的經(jīng)典基礎(chǔ)理論 可能是最漂亮的Spring事務(wù)管理詳解 面試中關(guān)于Java虛擬機(jī)(jvm)的問題看這篇就夠了 無論是在現(xiàn)實(shí)世界中還是在軟件...
閱讀 1664·2019-08-30 15:55
閱讀 985·2019-08-30 15:44
閱讀 879·2019-08-30 10:48
閱讀 2052·2019-08-29 13:42
閱讀 3193·2019-08-29 11:16
閱讀 1278·2019-08-29 11:09
閱讀 2064·2019-08-26 11:46
閱讀 624·2019-08-26 11:44