Java設(shè)計(jì)模式之構(gòu)建者模式知識(shí)總結(jié)
一、構(gòu)建者模式
1.1 定義
將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示
1.2 主要作用
在用戶不知道對(duì)象的建造過(guò)程和細(xì)節(jié)的情況下就可以直接創(chuàng)建復(fù)雜的對(duì)象。
用戶只需要給出指定復(fù)雜對(duì)象的類(lèi)型和內(nèi)容;
建造者模式負(fù)責(zé)按順序創(chuàng)建復(fù)雜對(duì)象(把內(nèi)部的建造過(guò)程和細(xì)節(jié)隱藏起來(lái))
1.3 解決的問(wèn)題
方便用戶創(chuàng)建復(fù)雜的對(duì)象(不需要知道實(shí)現(xiàn)過(guò)程)
代碼復(fù)用性 & 封裝性(將對(duì)象構(gòu)建過(guò)程和細(xì)節(jié)進(jìn)行封裝 & 復(fù)用)
例子:造汽車(chē) & 買(mǎi)汽車(chē)。 工廠(建造者模式):負(fù)責(zé)制造汽車(chē)(組裝過(guò)程和細(xì)節(jié)在工廠內(nèi)) 汽車(chē)購(gòu)買(mǎi)者(用戶):你只需要說(shuō)出你需要的型號(hào)(對(duì)象的類(lèi)型和內(nèi)容),然后直接購(gòu)買(mǎi)就可以使用了 (不需要知道汽車(chē)是怎么組裝的(車(chē)輪、車(chē)門(mén)、發(fā)動(dòng)機(jī)、方向盤(pán)等等))
示例:pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。
二、模式原理
2.1 模式講解
1.指揮者(Director)直接和客戶(Client)進(jìn)行需求溝通;
2.溝通后指揮者將客戶創(chuàng)建產(chǎn)品的需求劃分為各個(gè)部件的建造請(qǐng)求(Builder);
3.將各個(gè)部件的建造請(qǐng)求委派到具體的建造者(ConcreteBuilder);
4.各個(gè)具體建造者負(fù)責(zé)進(jìn)行產(chǎn)品部件的構(gòu)建;
5.最終構(gòu)建成具體產(chǎn)品(Product)。
2.2 實(shí)例講解
2.2.1 實(shí)例概況
背景:小成希望去電腦城買(mǎi)一臺(tái)組裝的臺(tái)式主機(jī)
過(guò)程:
1. 電腦城老板(Diretor)和小成(Client)進(jìn)行需求溝通(買(mǎi)來(lái)打游戲?學(xué)習(xí)?看片?)
2. 了解需求后,電腦城老板將小成需要的主機(jī)劃分為各個(gè)部件(Builder)的建造請(qǐng)求(CPU、主板blabla)
指揮裝機(jī)人員(ConcreteBuilder)去構(gòu)建組件;
將組件組裝起來(lái)成小成需要的電腦(Product)
2.2.2 使用步驟
步驟1: 定義組裝的過(guò)程(Builder):組裝電腦的過(guò)程
public abstract class Builder { //第一步:裝CPU //聲明為抽象方法,具體由子類(lèi)實(shí)現(xiàn) public abstract void BuildCPU(); //第二步:裝主板 //聲明為抽象方法,具體由子類(lèi)實(shí)現(xiàn) public abstract void BuildMainboard(); //第三步:裝硬盤(pán) //聲明為抽象方法,具體由子類(lèi)實(shí)現(xiàn) public abstract void BuildHD(); //返回產(chǎn)品的方法:獲得組裝好的電腦 public abstract Computer GetComputer(); }
步驟2: 電腦城老板委派任務(wù)給裝機(jī)人員(Director)
public class Director{ //指揮裝機(jī)人員組裝電腦 public void Construct(Builder builder){ builder. BuildCPU(); builder.BuildMainboard(); builder. BuildHD(); } }
步驟3:創(chuàng)建具體的建造者(ConcreteBuilder):裝機(jī)人員
//裝機(jī)人員1 public class ConcreteBuilder extend Builder{ //創(chuàng)建產(chǎn)品實(shí)例 Computer computer = new Computer(); //組裝產(chǎn)品 @Override public void BuildCPU(){ computer.Add("組裝CPU") } @Override public void BuildMainboard(){ computer.Add("組裝主板") } @Override public void BuildHD(){ computer.Add("組裝主板") } //返回組裝成功的電腦 @Override public Computer GetComputer(){ return computer } }
步驟4:定義具體產(chǎn)品類(lèi)(Product):電腦
public class Computer{ //電腦組件的集合 private List<String> parts = new ArrayList<String>(); //用于將組件組裝到電腦里 public void Add(String part){ parts.add(part); } public void Show(){ for (int i = 0;i<parts.size();i++){ System.out.println(“組件”+parts.get(i)+“裝好了”); } System.out.println(“電腦組裝完成,請(qǐng)驗(yàn)收”); } }
步驟5:客戶端調(diào)用-小成到電腦城找老板買(mǎi)電腦
public class Builder Pattern{ public static void main(String[] args){ //逛了很久終于發(fā)現(xiàn)一家合適的電腦店 //找到該店的老板和裝機(jī)人員 Director director = new Director(); Builder builder = new ConcreteBuilder(); //溝通需求后,老板叫裝機(jī)人員去裝電腦 director.Construct(builder); //裝完后,組裝人員搬來(lái)組裝好的電腦 Computer computer = builder.GetComputer(); //組裝人員展示電腦給小成看 computer.Show(); } }
組件CUP裝好了
組件主板裝好了
組件硬盤(pán)裝好了
電腦組裝完成,請(qǐng)驗(yàn)收
三、優(yōu)缺點(diǎn)
3.1 優(yōu)點(diǎn)
- 易于解耦
將產(chǎn)品本身與產(chǎn)品創(chuàng)建過(guò)程進(jìn)行解耦,可以使用相同的創(chuàng)建過(guò)程來(lái)得到不同的產(chǎn)品。也就說(shuō)細(xì)節(jié)依賴抽象。
- 易于精確控制對(duì)象的創(chuàng)建
將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過(guò)程更加清晰
- 易于拓展
增加新的具體建造者無(wú)需修改原有類(lèi)庫(kù)的代碼,易于拓展,符合“開(kāi)閉原則“。
每一個(gè)具體建造者都相對(duì)獨(dú)立,而與其他的具體建造者無(wú)關(guān),因此可以很方便地替換具體建造者或增加新的具體建造者,用戶使用不同的具體建造者即可得到不同的產(chǎn)品對(duì)象。
3.2 缺點(diǎn)
-建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點(diǎn),其組成部分相似;如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,因此其使用范圍受到一定的限制。
如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能會(huì)導(dǎo)致需要定義很多具體建造者類(lèi)來(lái)實(shí)現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大。
四、應(yīng)用場(chǎng)景
需要生成的產(chǎn)品對(duì)象有復(fù)雜的內(nèi)部結(jié)構(gòu),這些產(chǎn)品對(duì)象具備共性;
隔離復(fù)雜對(duì)象的創(chuàng)建和使用,并使得相同的創(chuàng)建過(guò)程可以創(chuàng)建不同的產(chǎn)品。
五、在MyBatis中的應(yīng)用
MyBatis中最經(jīng)典的建造者模式肯定是獲取SqlSessionFactory的過(guò)程。
下面是獲取SqlSessionFactory的典型用法。
CopyClassPathResource resource = new ClassPathResource("mybatis-config.xml"); InputStream inputStream = resource.getInputStream(); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
通過(guò)上面代碼發(fā)現(xiàn),創(chuàng)建SqlSessionFactory的代碼在SqlSessionFactoryBuilder中,進(jìn)去一探究竟:
//整個(gè)過(guò)程就是將配置文件解析成Configration對(duì)象,然后創(chuàng)建SqlSessionFactory的過(guò)程 //Configuration是SqlSessionFactory的一個(gè)內(nèi)部屬性 public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); return build(parser.parse()); } catch (Exception e) { throw ExceptionFactory.wrapException("Error building SqlSession.", e); } finally { ErrorContext.instance().reset(); try { inputStream.close(); } catch (IOException e) { // Intentionally ignore. Prefer previous error. } } } public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
代碼比較簡(jiǎn)單,就不具體分析了。這里還是對(duì)號(hào)入座,列舉下各個(gè)角色。
SqlSessionFactoryBuilder:指揮者角色
BaseBuilder:抽象
BuilderXMLConfigBuilder:具體的Builder
SqlSessionFactory:需要被創(chuàng)建的產(chǎn)品
到此這篇關(guān)于Java設(shè)計(jì)模式之構(gòu)建者模式知識(shí)總結(jié)的文章就介紹到這了,更多相關(guān)Java構(gòu)建者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 23種設(shè)計(jì)模式(10)java組合模式
- 快速理解Java設(shè)計(jì)模式中的組合模式
- JAVA設(shè)計(jì)模式之組合模式原理與用法詳解
- java設(shè)計(jì)模式之組合模式(Composite)
- Java設(shè)計(jì)模式之組合模式(Composite模式)介紹
- 淺談Java設(shè)計(jì)模式之七大設(shè)計(jì)原則
- 詳解java設(shè)計(jì)模式之六大原則
- Java設(shè)計(jì)模式之橋梁(Bridge)模式
- Java設(shè)計(jì)模式之代理模式詳解
- Java設(shè)計(jì)模式之原型模式詳解
- Java設(shè)計(jì)模式之抽象工廠模式詳解
- 詳細(xì)總結(jié)Java組合模式
相關(guān)文章
Spring解決依賴版本不一致報(bào)錯(cuò)問(wèn)題
許多同學(xué)經(jīng)常會(huì)遇到依賴版本不一致導(dǎo)致代碼報(bào)錯(cuò),所以這篇文章就給大家詳細(xì)介紹一下Spring解決依賴版本不一致報(bào)錯(cuò)問(wèn)題,需要的朋友跟著小編一起來(lái)看看吧2023-07-07java計(jì)算兩點(diǎn)間的距離方法總結(jié)
小編給大家總結(jié)了在java中計(jì)算兩點(diǎn)之家距離的方法以及相關(guān)實(shí)例代碼分享,有需要的讀者參考下。2018-02-02Java操作Jenkins操作憑證(Credential)信息方式
這篇文章主要介紹了Java操作Jenkins操作憑證(Credential)信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05基于SpringBoot生成二維碼的幾種實(shí)現(xiàn)方式
本文將基于Spring Boot介紹兩種生成二維碼的實(shí)現(xiàn)方式,一種是基于Google開(kāi)發(fā)工具包,另一種是基于Hutool來(lái)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2022-03-03Spring Security中用JWT退出登錄時(shí)遇到的坑
使用了JWT后,每次請(qǐng)求都要攜帶 Bearer Token 并且被專(zhuān)門(mén)的過(guò)濾器攔截解析之后才能將用戶認(rèn)證信息保存到 SecurityContext 中去,接下來(lái)通過(guò)本文給大家介紹Spring Security中用JWT退出登錄時(shí)遇到的坑,感興趣的朋友一起看看吧2021-10-10Spring中@EnableScheduling實(shí)現(xiàn)定時(shí)任務(wù)代碼實(shí)例
這篇文章主要介紹了Spring中@EnableScheduling實(shí)現(xiàn)定時(shí)任務(wù)代碼實(shí)例,@EnableScheduling 注解開(kāi)啟定時(shí)任務(wù)功能,可以將多個(gè)方法寫(xiě)在一個(gè)類(lèi),也可以分多個(gè)類(lèi)寫(xiě),當(dāng)然也可以將方法直接寫(xiě)在上面ScheddulConfig類(lèi)中,需要的朋友可以參考下2024-01-01Java 數(shù)據(jù)結(jié)構(gòu)算法Collection接口迭代器示例詳解
這篇文章主要為大家介紹了Java 數(shù)據(jù)結(jié)構(gòu)算法Collection接口迭代器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Spring框架構(gòu)造注入type屬性實(shí)例詳解
這篇文章主要介紹了Spring框架構(gòu)造注入type屬性實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12