23種設(shè)計模式(4) java生成器模式
23種設(shè)計模式第四篇:java生成器模式
定義:
將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。生成器模式利用一個導(dǎo)演者對象和具體建造者對象一個一個地建造出所有的零件,從而建造出完整的對象。
四個要素:
Builder:生成器接口,定義創(chuàng)建一個Product對象所需要的各個部件的操作。
ConcreteBuilder:具體的生成器實現(xiàn),實現(xiàn)各個部件的創(chuàng)建,并負責(zé)組裝Product對象的各個部件,同時還提供一個讓用戶獲取組裝完成后的產(chǎn)品對象的方法。
Director:指導(dǎo)者,也被稱導(dǎo)向者,主要用來使用Builder接口,以一個統(tǒng)一的過程來構(gòu)建所需要的Product對象。
Product:產(chǎn)品,表示被生成器構(gòu)建的復(fù)雜對象,包含多個部件。
示例:
網(wǎng)上有用KFC的例子來描述生成器模式,比較通俗易懂。
假設(shè)KFC推出兩種套餐:奧爾良雞腿堡套餐和香辣雞腿堡套餐。
奧爾良套餐包括:一個奧爾良雞腿堡、一個炸雞翅、一杯雪碧。
雞腿堡套餐包括:一個香辣雞腿堡、一份薯條、一杯可樂。
每份套餐都是:主食、副食、飲料。
KFC服務(wù)員要根據(jù)顧客的要求來提供套餐,那這個需求里面什么是固定的,什么是變化的呢?很明顯顧客都是要的套餐,顧客的目的是一樣的。 套餐里面都是主食、副食、飲料,這也是固定的。至于主食是什么、副食是什么、飲料是什么,這個是變化的。
在實際的軟件開發(fā)過程中,有時候面臨著“一個復(fù)雜對象”的創(chuàng)建工作,其通常由各個部分的子對象采用一定的組合構(gòu)成,由于需求的變化,這個復(fù)雜對象的各個部分或者其子對象經(jīng)常要變化(例如,雞腿堡套餐的顧客不喜歡可樂,要換奶茶),但是他們的結(jié)構(gòu)卻相對穩(wěn)定(套餐都得是一份主食,副食及飲料)。當遇到這種場景時,使用生成器模式比較合適。
定義一個產(chǎn)品類:
public class Entity1{...}
public class Entity2{...}
public class Entity3{...}
public class Product{
Entity1 entity1;
Entity2 entity2;
Entity3 entity3;
}
產(chǎn)品類中的各個小模塊是不一樣的,由他們建造組成產(chǎn)品。
根據(jù)具體場景要求,定義n個生成器類:
public interface IBuild{
public void createEntity1();
public void createEntity2();
public void createEntity3();
public Product composite();
public Product create();
}
public class BuildProduct implements IBuild{
Product p = new Product();
public void createEntity1(){
//p.entity1 = ...
}
public Product create(){
return composite();
}
......
}
public class BuildProduct1 implements IBuild{
Product p = new Product();
public void createEntity1(){
//p.entity1 = ...
}
......
}
定義一個指揮者類,統(tǒng)一調(diào)度project:
public class Director{
private IBuild build;
public Director(IBuild build){
this.build = buid;
}
public Product build(){
build.create();
}
public static void main(){
IBuild build = new BuildProduct();
Director direcotr = new Director(build);
Prodcut p = director.build();
}
}
優(yōu)點:
1、使用生成器模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié)。
2、具體的建造者類之間是相互獨立的,對系統(tǒng)的擴展非常有利。
3、由于具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他的模塊產(chǎn)生任何影響。
缺點:
建造者模式的“加工工藝”是暴露的,這樣使得建造者模式更加靈活,也使得工藝變得對客戶不透明。(待考證,筆者這里不是很理解,歡迎說自己的見解)
應(yīng)用場景:
1、需要生成一個產(chǎn)品對象有復(fù)雜的內(nèi)部結(jié)構(gòu)。每一個內(nèi)部成分本身可以是對象,也可以使一個對象的一個組成部分。
2、需要生成的產(chǎn)品對象的屬性相互依賴。建造模式可以強制實行一種分步驟進行的建造過程。
3、在對象創(chuàng)建過程中會使用到系統(tǒng)中的其他一些對象,這些對象在產(chǎn)品對象的創(chuàng)建過程中不易得到
轉(zhuǎn)自:java知音
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java獲取e.printStackTrace()打印的信息方式
這篇文章主要介紹了Java獲取e.printStackTrace()打印的信息方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
JAVA并發(fā)中VOLATILE關(guān)鍵字的神奇之處詳解
這篇文章主要給大家介紹了關(guān)于JAVA并發(fā)中VOLATILE關(guān)鍵字的神奇之處的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
SpringBoot整合EasyExcel實現(xiàn)導(dǎo)入導(dǎo)出數(shù)據(jù)
這篇文章主要為大家詳細介紹了如何使用Vue、SpringBoot和EasyExcel實現(xiàn)導(dǎo)入導(dǎo)出數(shù)據(jù)功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-05-05
javabean?中使用@Transient屬性處理臨時字段
@Transient表示該屬性并非一個到數(shù)據(jù)庫表的字段的映射,ORM框架將忽略該屬性,本文給大家介紹javabean?中臨時字段的處理:@Transient,感興趣的朋友跟隨小編一起看看吧2023-08-08
MybatisPlus如何自定義TypeHandler映射JSON類型為List
這篇文章主要介紹了MybatisPlus如何自定義TypeHandler映射JSON類型為List,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
客戶端Socket與服務(wù)端ServerSocket串聯(lián)實現(xiàn)網(wǎng)絡(luò)通信
這篇文章主要為大家介紹了客戶端Socket與服務(wù)端ServerSocket串聯(lián)實現(xiàn)網(wǎng)絡(luò)通信的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03

