建造者模式+鏈?zhǔn)骄幊?/font>
建造者模式詳解
在軟件開發(fā)過程中有時(shí)需要?jiǎng)?chuàng)建一個(gè)復(fù)雜的對(duì)象,這個(gè)復(fù)雜對(duì)象通常由多個(gè)子部件按一定的步驟組合而成。例如,計(jì)算機(jī)是由 CPU、主板、內(nèi)存、硬盤、顯卡、機(jī)箱、顯示器、鍵盤、鼠標(biāo)等部件組裝而成的,采購員不可能自己去組裝計(jì)算機(jī),而是將計(jì)算機(jī)的配置要求告訴計(jì)算機(jī)銷售公司,計(jì)算機(jī)銷售公司安排技術(shù)人員去組裝計(jì)算機(jī),然后再交給要買計(jì)算機(jī)的采購員。
生活中這樣的例子很多,如游戲中的不同角色,其性別、個(gè)性、能力、臉型、體型、服裝、發(fā)型等特性都有所差異;還有汽車中的方向盤、發(fā)動(dòng)機(jī)、車架、輪胎等部件也多種多樣;每封電子郵件的發(fā)件人、收件人、主題、內(nèi)容、附件等內(nèi)容也各不相同。
以上所有這些產(chǎn)品都是由多個(gè)部件構(gòu)成的,各個(gè)部件可以靈活選擇,但其創(chuàng)建步驟都大同小異。這類產(chǎn)品的創(chuàng)建無法用前面介紹的工廠模式描述,只有建造者模式可以很好地描述該類產(chǎn)品的創(chuàng)建。
模式的定義與特點(diǎn)
建造者(Builder)模式的定義:指將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示,這樣的設(shè)計(jì)模式被稱為建造者模式。它是將一個(gè)復(fù)雜的對(duì)象分解為多個(gè)簡單的對(duì)象,然后一步一步構(gòu)建而成。它將變與不變相分離,即產(chǎn)品的組成部分是不變的,但每一部分是可以靈活選擇的。
該模式的主要優(yōu)點(diǎn)如下:
封裝性好,構(gòu)建和表示分離。
擴(kuò)展性好,各個(gè)具體的建造者相互獨(dú)立,有利于系統(tǒng)的解耦。
客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),建造者可以對(duì)創(chuàng)建過程逐步細(xì)化,而不對(duì)其它模塊產(chǎn)生任何影響,便于控制細(xì)節(jié)風(fēng)險(xiǎn)。
其缺點(diǎn)如下:
產(chǎn)品的組成部分必須相同,這限制了其使用范圍。
如果產(chǎn)品的內(nèi)部變化復(fù)雜,如果產(chǎn)品內(nèi)部發(fā)生變化,則建造者也要同步修改,后期維護(hù)成本較大。
建造者(Builder)模式和工廠模式的關(guān)注點(diǎn)不同:建造者模式注重零部件的組裝過程,而工廠方法模式更注重零部件的創(chuàng)建過程,但兩者可以結(jié)合使用。
模式的結(jié)構(gòu)與實(shí)現(xiàn)
建造者(Builder)模式由產(chǎn)品、抽象建造者、具體建造者、指揮者等 4 個(gè)要素構(gòu)成,現(xiàn)在我們來分析其基本結(jié)構(gòu)和實(shí)現(xiàn)方法。
1. 模式的結(jié)構(gòu)
建造者(Builder)模式的主要角色如下。
產(chǎn)品角色(Product):它是包含多個(gè)組成部件的復(fù)雜對(duì)象,由具體建造者來創(chuàng)建其各個(gè)零部件。
抽象建造者(Builder):它是一個(gè)包含創(chuàng)建產(chǎn)品各個(gè)子部件的抽象方法的接口,通常還包含一個(gè)返回復(fù)雜產(chǎn)品的方法 getResult()。
具體建造者(Concrete Builder):實(shí)現(xiàn) Builder 接口,完成復(fù)雜產(chǎn)品的各個(gè)部件的具體創(chuàng)建方法。
指揮者(Director):它調(diào)用建造者對(duì)象中的部件構(gòu)造與裝配方法完成復(fù)雜對(duì)象的創(chuàng)建,在指揮者中不涉及具體產(chǎn)品的信息。
示例:建房子
產(chǎn)品角色-House ,
抽象建造者 - HouseBuilder,
具體建造者 - ConcreteBuilder,
指揮者- Director
House
import lombok.Data;
/**
* 描述: 房子 </br>
* 時(shí)間: 2020-01-14 11:23 </br>
* 作者:it學(xué)習(xí)道場(chǎng)
*/
@Data
public class House {
/**地基*/
private String foundation;
/**墻體*/
private String wall;
/**房頂*/
private String roof;
public static HouseBuilder builder(){
HouseBuilder houseBuilder = new ConcreteBuilder();
return houseBuilder;
}
}
HouseBuilder(抽象建造者 )
/**
* 描述: 抽象建造者:包含創(chuàng)建房子各個(gè)部位的抽象方法。</br>
* 時(shí)間: 2020-01-14 11:26 </br>
* 作者:it學(xué)習(xí)道場(chǎng)
*/
public abstract class HouseBuilder {
/**
* 建造地基
*/
public abstract HouseBuilder foundation();
/**
* 建造墻體
*/
public abstract HouseBuilder wall();
/**
* 建造屋頂
*/
public abstract HouseBuilder roof();
//返回產(chǎn)品對(duì)象
public abstract House build() ;
}
ConcreteBuilder - 具體建造者
/**
* 描述: 具體房屋建造者 </br>
* 時(shí)間: 2020-01-14 11:32 </br>
* 作者:it學(xué)習(xí)道場(chǎng)
*/
public class ConcreteBuilder extends HouseBuilder {
protected House house = new House();
@Override
public ConcreteBuilder foundation() {
house.setFoundation("建造地基");
return this;
//house.setFoundation("建造地基");
}
@Override
public ConcreteBuilder wall() {
house.setWall("建造墻體");
return this;
}
@Override
public ConcreteBuilder roof() {
house.setRoof("建造屋頂");
return this;
}
@Override
public House build() {
return house;
}
}
Director - 指揮者
/**
* 描述: 指揮者:鏈?zhǔn)骄幊滔碌逆準(zhǔn)浇ㄔ臁?lt;/br>
* 時(shí)間: 2020-01-14 11:35 </br>
* 作者:it學(xué)習(xí)道場(chǎng)
*/
public class Director {
public static void main(String[] args) {
House house = House.builder()
.foundation()
.wall()
.roof()
.build();
System.out.println(house.toString());
}
}
指揮者-Director就是建造者模式入口,這里的main方法就是你們程序里的用建造者干活的入口
作者:IT學(xué)習(xí)道場(chǎng)
歡迎關(guān)注微信公眾號(hào) : IT學(xué)習(xí)道場(chǎng)