設(shè)計(jì)模式之構(gòu)建(Builder)模式 建造房子實(shí)例分析
更新時(shí)間:2012年12月07日 12:07:35 作者:
構(gòu)建模式主要用來(lái)針對(duì)復(fù)雜產(chǎn)品生產(chǎn),分離部件構(gòu)建細(xì)節(jié),以達(dá)到良好的伸縮性,考慮到設(shè)計(jì)模式來(lái)源于建筑學(xué),因此舉一個(gè)建造房子的例子,需要的朋友可以參考下
構(gòu)建模式主要用來(lái)針對(duì)復(fù)雜產(chǎn)品生產(chǎn),分離部件構(gòu)建細(xì)節(jié),以達(dá)到良好的伸縮性。
考慮到設(shè)計(jì)模式來(lái)源于建筑學(xué),因此舉一個(gè)建造房子的例子?,F(xiàn)在一個(gè)客戶(hù)要建造一棟房子House,
public class House{
//客戶(hù)需求的房子
}
那么他首先需要一個(gè)設(shè)計(jì)師—Designer,但是設(shè)計(jì)師只能做設(shè)計(jì),指示如何去建造房子,可是他并不會(huì)親自去做,那么就還需要一個(gè)施工隊(duì)伍BuildTeam,那么首先,Designer要設(shè)計(jì)出來(lái)如何去建造這棟房子,首先要施工隊(duì)打地基,然后施工隊(duì)要架骨架、接著上水泥等等(具體如何不得而知,需要請(qǐng)教專(zhuān)業(yè)人士),那么從這里我們可以知道設(shè)計(jì)師對(duì)施工隊(duì)是有要求的,那就是施工隊(duì)必須要會(huì)打地基、會(huì)架骨架、會(huì)上水泥等,因此得出如下招聘施工隊(duì)的要求:
public interface BuildTeam{
public void 打地基();
public void 架骨架();
public void 上水泥();
。。。。。。
}
從上可以看出,要想做這個(gè)工程的施工隊(duì)伍,必須首先符號(hào)上面的條件,會(huì)做上面所有的事情。根據(jù)設(shè)計(jì)師的設(shè)計(jì),又得知設(shè)計(jì)師會(huì)向施工隊(duì)下達(dá)一個(gè)命令,然后施工隊(duì)按照設(shè)計(jì)師的要求開(kāi)始施工:
public class Designer{
public void construct(BuildTeam team){
team.打地基();
team.架骨架();
team.上水泥();
}
}
由于從頭到尾都是設(shè)計(jì)師在下指令設(shè)計(jì),而施工隊(duì)進(jìn)行實(shí)際施工,所以客戶(hù)最終會(huì)找施工隊(duì)驗(yàn)收房子,因此施工隊(duì)必須要交付房子給客戶(hù),因此施工隊(duì)需要加上一個(gè)交付房子的條款,不然房子做成了,但是施工隊(duì)卻不交付給我,那不是吃虧了,因此:
public interface BuildTeam{
public void 打地基();
public void 架骨架();
public void 上水泥();
。。。。。。
public House deliverHouse(); //增加一個(gè)交付房子的方法。
}
好了,房子設(shè)計(jì)好了,如何做也設(shè)計(jì)好了,如今就差給誰(shuí)來(lái)做了,現(xiàn)在有一個(gè)施工隊(duì):
public class BuildTeamA extends BuildTeam{
public void 打地基(){}
public void 架骨架(){}
public void 上水泥(){}
。。。。。。
public House deliverHouse(){}
}
從施工隊(duì)的情況來(lái)看, 這個(gè)施工隊(duì)完全符合設(shè)計(jì)師對(duì)施工隊(duì)的要求,既接口BuildTeam,好,那么最終決定由他們來(lái)做,從頭到尾全部流程如下:
Designer designer = new Designer(); //找到一個(gè)設(shè)計(jì)師
BuildTeam teamA = new BuildTeamA(); //找到一個(gè)施工隊(duì)伍BuildTeamA
designer.construct(teamA); //設(shè)計(jì)師下命令,讓施工隊(duì)伍按照他的設(shè)計(jì)開(kāi)始建造
House house = teamA.deliverHouse(); //施工隊(duì)完成后交付房子
第一棟房子終于建成了,此時(shí)同一個(gè)客戶(hù)覺(jué)得這個(gè)設(shè)計(jì)師的設(shè)計(jì)不錯(cuò),于是決定還要使用他的設(shè)計(jì)并由他指示施工隊(duì)再造一棟同樣的房子,可是施工隊(duì)BuildTeamA突然獅子大開(kāi)口,想要更多的錢(qián),客戶(hù)為了節(jié)省成本,只好再次招聘一個(gè)新的施工隊(duì)進(jìn)行施工,剛好有個(gè)施工隊(duì)伍BuildTeamB符合要求,于是流程如下:
BuildTeam teamB = new BuildTeamB();
designer.construct(teamB); //由于設(shè)計(jì)師沒(méi)變,且造同樣的房子,所以designer不需要重新找,只需要把他指示的施工隊(duì)換成BuildTeamB即可
House house = teamB.deliverHouse(); //施工隊(duì)完成后交付房子
好了,第二棟房子也完成了,但是整個(gè)流程上并沒(méi)有太大的變動(dòng),由于使用了構(gòu)建模式,整個(gè)流程分工非常明確,客戶(hù)不需要參與任何設(shè)計(jì)以及建造,設(shè)計(jì)師只負(fù)責(zé)設(shè)計(jì)以及下命令,而施工隊(duì)也僅僅只負(fù)責(zé)具體的實(shí)現(xiàn)細(xì)節(jié),使得建造明細(xì)獨(dú)立出來(lái),隨時(shí)更換不同的施工隊(duì)均可。
考慮到設(shè)計(jì)模式來(lái)源于建筑學(xué),因此舉一個(gè)建造房子的例子?,F(xiàn)在一個(gè)客戶(hù)要建造一棟房子House,
復(fù)制代碼 代碼如下:
public class House{
//客戶(hù)需求的房子
}
那么他首先需要一個(gè)設(shè)計(jì)師—Designer,但是設(shè)計(jì)師只能做設(shè)計(jì),指示如何去建造房子,可是他并不會(huì)親自去做,那么就還需要一個(gè)施工隊(duì)伍BuildTeam,那么首先,Designer要設(shè)計(jì)出來(lái)如何去建造這棟房子,首先要施工隊(duì)打地基,然后施工隊(duì)要架骨架、接著上水泥等等(具體如何不得而知,需要請(qǐng)教專(zhuān)業(yè)人士),那么從這里我們可以知道設(shè)計(jì)師對(duì)施工隊(duì)是有要求的,那就是施工隊(duì)必須要會(huì)打地基、會(huì)架骨架、會(huì)上水泥等,因此得出如下招聘施工隊(duì)的要求:
復(fù)制代碼 代碼如下:
public interface BuildTeam{
public void 打地基();
public void 架骨架();
public void 上水泥();
。。。。。。
}
從上可以看出,要想做這個(gè)工程的施工隊(duì)伍,必須首先符號(hào)上面的條件,會(huì)做上面所有的事情。根據(jù)設(shè)計(jì)師的設(shè)計(jì),又得知設(shè)計(jì)師會(huì)向施工隊(duì)下達(dá)一個(gè)命令,然后施工隊(duì)按照設(shè)計(jì)師的要求開(kāi)始施工:
復(fù)制代碼 代碼如下:
public class Designer{
public void construct(BuildTeam team){
team.打地基();
team.架骨架();
team.上水泥();
}
}
由于從頭到尾都是設(shè)計(jì)師在下指令設(shè)計(jì),而施工隊(duì)進(jìn)行實(shí)際施工,所以客戶(hù)最終會(huì)找施工隊(duì)驗(yàn)收房子,因此施工隊(duì)必須要交付房子給客戶(hù),因此施工隊(duì)需要加上一個(gè)交付房子的條款,不然房子做成了,但是施工隊(duì)卻不交付給我,那不是吃虧了,因此:
復(fù)制代碼 代碼如下:
public interface BuildTeam{
public void 打地基();
public void 架骨架();
public void 上水泥();
。。。。。。
public House deliverHouse(); //增加一個(gè)交付房子的方法。
}
好了,房子設(shè)計(jì)好了,如何做也設(shè)計(jì)好了,如今就差給誰(shuí)來(lái)做了,現(xiàn)在有一個(gè)施工隊(duì):
復(fù)制代碼 代碼如下:
public class BuildTeamA extends BuildTeam{
public void 打地基(){}
public void 架骨架(){}
public void 上水泥(){}
。。。。。。
public House deliverHouse(){}
}
從施工隊(duì)的情況來(lái)看, 這個(gè)施工隊(duì)完全符合設(shè)計(jì)師對(duì)施工隊(duì)的要求,既接口BuildTeam,好,那么最終決定由他們來(lái)做,從頭到尾全部流程如下:
Designer designer = new Designer(); //找到一個(gè)設(shè)計(jì)師
BuildTeam teamA = new BuildTeamA(); //找到一個(gè)施工隊(duì)伍BuildTeamA
designer.construct(teamA); //設(shè)計(jì)師下命令,讓施工隊(duì)伍按照他的設(shè)計(jì)開(kāi)始建造
House house = teamA.deliverHouse(); //施工隊(duì)完成后交付房子
第一棟房子終于建成了,此時(shí)同一個(gè)客戶(hù)覺(jué)得這個(gè)設(shè)計(jì)師的設(shè)計(jì)不錯(cuò),于是決定還要使用他的設(shè)計(jì)并由他指示施工隊(duì)再造一棟同樣的房子,可是施工隊(duì)BuildTeamA突然獅子大開(kāi)口,想要更多的錢(qián),客戶(hù)為了節(jié)省成本,只好再次招聘一個(gè)新的施工隊(duì)進(jìn)行施工,剛好有個(gè)施工隊(duì)伍BuildTeamB符合要求,于是流程如下:
復(fù)制代碼 代碼如下:
BuildTeam teamB = new BuildTeamB();
designer.construct(teamB); //由于設(shè)計(jì)師沒(méi)變,且造同樣的房子,所以designer不需要重新找,只需要把他指示的施工隊(duì)換成BuildTeamB即可
House house = teamB.deliverHouse(); //施工隊(duì)完成后交付房子
好了,第二棟房子也完成了,但是整個(gè)流程上并沒(méi)有太大的變動(dòng),由于使用了構(gòu)建模式,整個(gè)流程分工非常明確,客戶(hù)不需要參與任何設(shè)計(jì)以及建造,設(shè)計(jì)師只負(fù)責(zé)設(shè)計(jì)以及下命令,而施工隊(duì)也僅僅只負(fù)責(zé)具體的實(shí)現(xiàn)細(xì)節(jié),使得建造明細(xì)獨(dú)立出來(lái),隨時(shí)更換不同的施工隊(duì)均可。
相關(guān)文章
Java游戲服務(wù)器系列之Netty相關(guān)知識(shí)總結(jié)
今天帶大家來(lái)學(xué)習(xí)Java游戲服務(wù)器的相關(guān)知識(shí),文中對(duì)Netty作了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05Java Hibernate中的查詢(xún)策略和抓取策略
Hibernate是一種Java對(duì)象關(guān)系映射框架,提供了多種查詢(xún)和抓取策略,用于優(yōu)化數(shù)據(jù)庫(kù)訪問(wèn)性能。查詢(xún)策略包括延遲加載、立即加載、查詢(xún)緩存等,抓取策略包括join抓取、子查詢(xún)抓取、批量抓取等。這些策略可以根據(jù)實(shí)際應(yīng)用場(chǎng)景進(jìn)行選擇和配置,提高數(shù)據(jù)訪問(wèn)的效率和穩(wěn)定性2023-04-04Java多線程 Producer and Consumer設(shè)計(jì)模式
這篇文章主要介紹了Java多線程 Producer and Consumer設(shè)計(jì)模式,producer是生產(chǎn)者的意思:指生產(chǎn)數(shù)據(jù)的線程,consumer是消費(fèi)者的意思,指的是使用數(shù)據(jù)的線程,下文圍繞Producer及Consumer展開(kāi)話題,需要的朋友可以參考一下2021-10-10Java thrift服務(wù)器和客戶(hù)端創(chuàng)建實(shí)例代碼
Thrift是一個(gè)軟件框架,用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā)。接下來(lái)通過(guò)本文給大家介紹Java thrift服務(wù)器和客戶(hù)端創(chuàng)建實(shí)例代碼,需要的朋友參考下吧2017-04-04SpringBoot2 整合Ehcache組件,輕量級(jí)緩存管理的原理解析
這篇文章主要介紹了SpringBoot2 整合Ehcache組件,輕量級(jí)緩存管理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08詳解使用JavaCV/OpenCV抓取并存儲(chǔ)攝像頭圖像
本篇文章主要介紹了使用JavaCV/OpenCV抓取并存儲(chǔ)攝像頭圖像,實(shí)例分析了使用JavaCV/OpenCV抓取并存儲(chǔ)攝像頭圖像的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04Spring整合mybatis、springMVC總結(jié)
這篇文章主要為大家詳細(xì)介紹了Java整合Mybatis,SpringMVC,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-05-05java基于TCP協(xié)議實(shí)現(xiàn)聊天程序
這篇文章主要為大家詳細(xì)介紹了java基于TCP協(xié)議實(shí)現(xiàn)聊天程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07