23種設(shè)計(jì)模式(4) java生成器模式
23種設(shè)計(jì)模式第四篇:java生成器模式
定義:
將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。生成器模式利用一個(gè)導(dǎo)演者對(duì)象和具體建造者對(duì)象一個(gè)一個(gè)地建造出所有的零件,從而建造出完整的對(duì)象。
四個(gè)要素:
Builder:生成器接口,定義創(chuàng)建一個(gè)Product對(duì)象所需要的各個(gè)部件的操作。
ConcreteBuilder:具體的生成器實(shí)現(xiàn),實(shí)現(xiàn)各個(gè)部件的創(chuàng)建,并負(fù)責(zé)組裝Product對(duì)象的各個(gè)部件,同時(shí)還提供一個(gè)讓用戶獲取組裝完成后的產(chǎn)品對(duì)象的方法。
Director:指導(dǎo)者,也被稱導(dǎo)向者,主要用來(lái)使用Builder接口,以一個(gè)統(tǒng)一的過(guò)程來(lái)構(gòu)建所需要的Product對(duì)象。
Product:產(chǎn)品,表示被生成器構(gòu)建的復(fù)雜對(duì)象,包含多個(gè)部件。
示例:
網(wǎng)上有用KFC的例子來(lái)描述生成器模式,比較通俗易懂。
假設(shè)KFC推出兩種套餐:奧爾良雞腿堡套餐和香辣雞腿堡套餐。
奧爾良套餐包括:一個(gè)奧爾良雞腿堡、一個(gè)炸雞翅、一杯雪碧。
雞腿堡套餐包括:一個(gè)香辣雞腿堡、一份薯?xiàng)l、一杯可樂(lè)。
每份套餐都是:主食、副食、飲料。
KFC服務(wù)員要根據(jù)顧客的要求來(lái)提供套餐,那這個(gè)需求里面什么是固定的,什么是變化的呢?很明顯顧客都是要的套餐,顧客的目的是一樣的。 套餐里面都是主食、副食、飲料,這也是固定的。至于主食是什么、副食是什么、飲料是什么,這個(gè)是變化的。
在實(shí)際的軟件開(kāi)發(fā)過(guò)程中,有時(shí)候面臨著“一個(gè)復(fù)雜對(duì)象”的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象采用一定的組合構(gòu)成,由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分或者其子對(duì)象經(jīng)常要變化(例如,雞腿堡套餐的顧客不喜歡可樂(lè),要換奶茶),但是他們的結(jié)構(gòu)卻相對(duì)穩(wěn)定(套餐都得是一份主食,副食及飲料)。當(dāng)遇到這種場(chǎng)景時(shí),使用生成器模式比較合適。
定義一個(gè)產(chǎn)品類(lèi):
public class Entity1{...} public class Entity2{...} public class Entity3{...} public class Product{ Entity1 entity1; Entity2 entity2; Entity3 entity3; }
產(chǎn)品類(lèi)中的各個(gè)小模塊是不一樣的,由他們建造組成產(chǎn)品。
根據(jù)具體場(chǎng)景要求,定義n個(gè)生成器類(lèi):
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 = ... } ...... }
定義一個(gè)指揮者類(lèi),統(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)點(diǎn):
1、使用生成器模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)。
2、具體的建造者類(lèi)之間是相互獨(dú)立的,對(duì)系統(tǒng)的擴(kuò)展非常有利。
3、由于具體的建造者是獨(dú)立的,因此可以對(duì)建造過(guò)程逐步細(xì)化,而不對(duì)其他的模塊產(chǎn)生任何影響。
缺點(diǎn):
建造者模式的“加工工藝”是暴露的,這樣使得建造者模式更加靈活,也使得工藝變得對(duì)客戶不透明。(待考證,筆者這里不是很理解,歡迎說(shuō)自己的見(jiàn)解)
應(yīng)用場(chǎng)景:
1、需要生成一個(gè)產(chǎn)品對(duì)象有復(fù)雜的內(nèi)部結(jié)構(gòu)。每一個(gè)內(nèi)部成分本身可以是對(duì)象,也可以使一個(gè)對(duì)象的一個(gè)組成部分。
2、需要生成的產(chǎn)品對(duì)象的屬性相互依賴。建造模式可以強(qiáng)制實(shí)行一種分步驟進(jìn)行的建造過(guò)程。
3、在對(duì)象創(chuàng)建過(guò)程中會(huì)使用到系統(tǒng)中的其他一些對(duì)象,這些對(duì)象在產(chǎn)品對(duì)象的創(chuàng)建過(guò)程中不易得到
轉(zhuǎn)自:java知音
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java即將引入新對(duì)象類(lèi)型來(lái)解決內(nèi)存使用問(wèn)題
這篇文章主要介紹了Java即將引入新對(duì)象類(lèi)型來(lái)解決內(nèi)存使用問(wèn)題,文章通過(guò)圍繞主題的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05SpringBoot+Mybatis使用Mapper接口注冊(cè)的幾種方式
本篇博文中主要介紹是Mapper接口與對(duì)應(yīng)的xml文件如何關(guān)聯(lián)的幾種姿勢(shì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07SpringBoot整合任務(wù)系統(tǒng)quartz和SpringTask的方法
這篇文章主要介紹了SpringBoot整合任務(wù)系統(tǒng)(quartz和SpringTask),Quartz是一個(gè)比較成熟了的定時(shí)任務(wù)框架,但是捏,它稍微的有些許繁瑣,本文先給大家講解下Quartz的一些基本概念結(jié)合實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解
這篇文章主要介紹了Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Java實(shí)現(xiàn)表達(dá)式二叉樹(shù)
這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)表達(dá)式二叉樹(shù),感興趣的小伙伴們可以參考一下2016-08-08SpringAOP 設(shè)置注入的實(shí)現(xiàn)步驟
這篇文章主要介紹了SpringAOP 設(shè)置注入的實(shí)現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用Spring框架,感興趣的朋友可以了解下2021-05-05圖解Java中插入排序算法的原理與實(shí)現(xiàn)
插入排序的算法描述是一種簡(jiǎn)單直觀的排序算法。它的工作原理是通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。本文將通過(guò)圖片詳解插入排序的原理及實(shí)現(xiàn),需要的可以參考一下2022-08-08