Java設計模式之建造者模式的示例詳解_第1頁
Java設計模式之建造者模式的示例詳解_第2頁
Java設計模式之建造者模式的示例詳解_第3頁
Java設計模式之建造者模式的示例詳解_第4頁
Java設計模式之建造者模式的示例詳解_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第Java設計模式之建造者模式的示例詳解目錄1定義2結構與角色3例子3.1代碼3.1.1Builder類3.1.2Worker類3.1.3Product類3.1.4Director類3.1.5Test測試類4不使用指揮者的例子4.1Builder類4.2Worker類4.3Product類4.4Test類5適用場景6優(yōu)缺點6.1優(yōu)點6.2缺點

1定義

建造者模式(BuilderPatten):將一個復雜對象的構建與他的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。

建造者模式用于一步一步創(chuàng)建一個復雜的對象,他允許用戶只通過指定復雜對象的類型和內(nèi)容進行構建,用戶不需要知道內(nèi)部的具體構建細節(jié)。建造者模式屬于對象創(chuàng)建型模式,根據(jù)翻譯的不同,建造者模式又可稱為生成器模式。

2結構與角色

建造者模式包含4個角色

Builder:抽象建造者。為創(chuàng)建一個Product對象的各個部件指定的抽象接口。ConcreteBuilder:具體建造者。實現(xiàn)抽象建造者Builder,構建和裝配產(chǎn)品的各個部件。做具體建造工作,但卻不為客戶端所知。Product:產(chǎn)品,被構建的復雜對象。具體建造者創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程。包含定義組成部件的類,包括將這些部件裝配成最終的產(chǎn)品的接口。Director:指揮者。構建一個使用抽象建造者Builder的對象。它與客戶端打交道,將客戶端創(chuàng)建產(chǎn)品的請求劃分為對各個零件的建造請求,再將這些請求委派給ConcreteBuilders。

3例子

建造樓房的過程中,有專業(yè)人員繪制圖紙,圖紙中講述干什么,工人根據(jù)圖紙去具體實現(xiàn)要干的事情,包工頭根據(jù)實際情況去處理圖紙中方法的執(zhí)行,調(diào)配工人以何種順序完成圖紙上的要求。雖然包工頭和圖紙對建造高樓很有幫助,但是高樓平地起,卻是由工人們一磚一瓦的搭建起來。

以上的這個例子很形象的講述建造者模式執(zhí)行過程,其中圖紙就對應Builder(提供方法,要干什么),工人就對應ConcreteBuilder(具體去干方法中規(guī)定的事情),包工頭就對應Director(以何種順序干,調(diào)配工人),高樓就對應Product。

3.1代碼

3.1.1Builder類

Builder類只提供抽象的方法,類似于圖紙,只是告訴你建造高樓你需要做什么。

//抽象方法,要做什么:建設一個大樓需要做什么

publicabstractclassBuilder{

abstractvoidbuilderA();

abstractvoidbuilderB();

abstractvoidbuilderC();

abstractvoidbuilderD();

abstractProductgetProduct();

}

3.1.2Worker類

工人是具體實現(xiàn)Builder提出的需求,比如水泥、鋼筋等等。工人類直接產(chǎn)生產(chǎn)品(new)

packagedemo01;

//知道了要做什么,就得有人來具體實現(xiàn)

publicclassWorkerextendsBuilder{

privateProductproduct;

publicWorker(){

product=newProduct();

@Override

voidbuilderA(){

product.setBuildA("打地基");

System.out.println("打地基");

@Override

voidbuilderB(){

product.setBuildB("鋼筋混凝土");

System.out.println("鋼筋混凝土");

@Override

voidbuilderC(){

product.setBuildC("蓋房子");

System.out.println("蓋房子");

@Override

voidbuilderD(){

product.setBuildD("油漆、粉刷");

System.out.println("油漆、粉刷");

ProductgetProduct()

returnproduct;

}

3.1.3Product類

當產(chǎn)品的本身的屬性一一被滿足的時候,產(chǎn)品才會產(chǎn)生。

publicclassProduct{

privateStringbuildA;

privateStringbuildB;

privateStringbuildC;

privateStringbuildD;

publicStringgetBuildA(){

returnbuildA;

publicvoidsetBuildA(StringbuildA){

this.buildA=buildA;

publicStringgetBuildB(){

returnbuildB;

publicvoidsetBuildB(StringbuildB){

this.buildB=buildB;

publicStringgetBuildC(){

returnbuildC;

publicvoidsetBuildC(StringbuildC){

this.buildC=buildC;

publicStringgetBuildD(){

returnbuildD;

publicvoidsetBuildD(StringbuildD){

this.buildD=buildD;

@Override

publicStringtoString(){

return"Product{"+

"buildA='"+buildA+'\''+

",buildB='"+buildB+'''+

",buildC='"+buildC+'\''+

",buildD='"+buildD+'''+

'}';

}

3.1.4Director類

包工頭,安排工人怎么去做,比如今天下雨,不打水泥了,去抬鋼筋,今天不下雨了,去打地基。

//指揮的作用是,以什么樣的順序,完成產(chǎn)品的制作

publicclassDirector{

publicProductgetProduct(Builderbuilder){

builder.builderA();

builder.builderB();

builder.builderC();

builder.builderD();

returnbuilder.getProduct();

}

3.1.5Test測試類

publicclassTest01{

publicstaticvoidmain(String[]args){

Directordirector=newDirector();

Productproduct=director.getProduct(newWorker());

System.out.println(product.toString());

指揮者調(diào)整順序可以得到不同的產(chǎn)品,或者不同的效果(雖然這個沒體現(xiàn)出來)

4不使用指揮者的例子

去餐廳吃飯,餐廳里一般有默認的套餐,或者自己(用戶)點餐,點餐之后,服務員根據(jù)訂單負責將食品端上來,然后你大快朵頤,享受美食帶來的快感

在這一場景里,就沒有指揮者,指揮權到達了用戶的手里。上面3中的場景,指揮權就不能到用戶手里,你不能讓人家掏錢還得讓人家自己建(除非是老板)。

4.1Builder類

publicabstractclassBuilder{

abstractBuilderbuilderA(Stringmsg);

abstractBuilderbuilderB(Stringmsg);

abstractBuilderbuilderC(Stringmsg);

abstractBuilderbuilderD(Stringmsg);

abstractProductgetProduct();

}

4.2Worker類

publicclassWorkerextendsBuilder{

privateProductproduct;

publicWorker(){

product=newProduct();

BuilderbuilderA(Stringmsg){

product.setBuildA(msg);

returnthis;

BuilderbuilderB(Stringmsg){

product.setBuildB(msg);

returnthis;

BuilderbuilderC(Stringmsg){

product.setBuildC(msg);

returnthis;

BuilderbuilderD(Stringmsg){

product.setBuildD(msg);

returnthis;

ProductgetProduct(){

returnproduct;

}

4.3Product類

publicclassProduct{

privateStringbuildA="炸雞";

privateStringbuildB="漢堡";

privateStringbuildC="可樂";

privateStringbuildD="大蒜";

publicStringgetBuildA(){

returnbuildA;

publicvoidsetBuildA(StringbuildA){

this.buildA=buildA;

publicStringgetBuildB(){

returnbuildB;

publicvoidsetBuildB(StringbuildB){

this.buildB=buildB;

publicStringgetBuildC(){

returnbuildC;

publicvoidsetBuildC(StringbuildC){

this.buildC=buildC;

publicStringgetBuildD(){

returnbuildD;

publicvoidsetBuildD(StringbuildD){

this.buildD=buildD;

@Override

publicStringtoString(){

return"Product{"+

"buildA='"+buildA+'\''+

",buildB='"+buildB+'''+

",buildC='"+buildC+'\''+

",buildD='"+buildD+'''+

'}';

}

4.4Test類

publicclassTest{

publicstaticvoidmain(String[]args){

Workerworker=newWorker();

System.out.println(worker.builderA("全家桶")

.getProduct());

上面的代碼例子中:Worker就相當于服務員,記錄你點了什么菜,并生成賬單(Product里的信息),反饋給用戶產(chǎn)品。

5適用場景

需要生成的產(chǎn)品對象有復雜的內(nèi)部結構(通常

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論