版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 衛(wèi)生用品更衣室管理制度
- 衛(wèi)生院行風督查制度
- 衛(wèi)生院三病物資管理制度
- 生活區(qū)衛(wèi)生物品管理制度
- 衛(wèi)生院疾病預防管理制度
- 衛(wèi)生所規(guī)范管理制度
- 養(yǎng)殖場日常衛(wèi)生管理制度
- 幼兒園8項衛(wèi)生管理制度
- 衛(wèi)生所首診負責制度
- 衛(wèi)生院新冠病人轉診制度
- 2026屆杭州高級中學高二上數(shù)學期末聯(lián)考試題含解析
- 2026年陜西氫能產(chǎn)業(yè)發(fā)展有限公司所屬單位社會公開招聘備考題庫及1套參考答案詳解
- 2026年及未來5年中國無取向硅鋼片行業(yè)市場深度分析及發(fā)展趨勢預測報告
- 棄土場規(guī)范規(guī)章制度
- 2026年水下機器人勘探報告及未來五至十年深海資源報告
- 2025年3月29日事業(yè)單位聯(lián)考(職測+綜應)ABCDE類筆試真題及答案解析
- 雙重預防體系建設自評報告模板
- 高血壓教學查房復習過程教案(2025-2026學年)
- 感控PDCA持續(xù)質(zhì)量改進
- 2025年云服務器采購合同協(xié)議
- 補氣血培訓課件
評論
0/150
提交評論