设计模式 - 建造者模式(Builder Pattern)
-
Separate the construction of a complex object from its representation so that the sameconstruction process can create different representations.(將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。)
建造者模式通用類圖
?
?
image.png
看上面圖可能有點(diǎn)懵,舉一個(gè)簡(jiǎn)單的例子
假如現(xiàn)在有一個(gè)生產(chǎn)電腦代工廠,可能會(huì)生產(chǎn)很多電腦品牌的組裝電腦,不同的電腦品牌組裝電腦的順序可能不一樣。
假如現(xiàn)在要為兩個(gè)電腦品牌(聯(lián)想、華為)組裝電腦
這些部件假如只有顯示器、鍵盤、鼠標(biāo)、硬盤
需求就是這樣,為不同電腦品牌組裝順序不一樣,但是都提供一個(gè)公共的方法assemble()
需求有點(diǎn)復(fù)雜我們現(xiàn)在看具體代碼
在ComputerModel中我們定義了一個(gè)setSequence方法,組裝點(diǎn)的這幾個(gè)動(dòng)作要如何排布,是在這個(gè)ArrayList中定義的。然后assemble()方法根據(jù)sequence定義的順序完成指定的順序動(dòng)作
首先創(chuàng)建ComputerModel
import org.apache.commons.lang3.StringUtils;import java.util.ArrayList; import java.util.List;/*** @author shuliangzhao* @Title: ComputerModel* @ProjectName design-parent* @Description: TODO* @date 2019/5/29 22:40*/ public abstract class ComputerModel {//sequence控制組裝順序private List<String> sequence = new ArrayList<>();protected abstract void productScreen();protected abstract void productMouse();protected abstract void productKeyboard();protected abstract void productHardDisk();public void assemble() {for (String str:sequence) {if (StringUtils.equals(str,"screen")) {this.productScreen();}else if (StringUtils.equals(str,"mouse")) {this.productMouse();}else if (StringUtils.equals(str,"keyboard")) {this.productKeyboard();}else if (StringUtils.equals(str,"hardDisk")) {this.productHardDisk();}}}public void setSequence(List<String> sequence) {this.sequence = sequence;} }LenovoComputer
/*** @author shuliangzhao* @Title: LenovoComputer* @ProjectName design-parent* @Description: TODO* @date 2019/5/29 22:49*/public class LenovoComputer extends ComputerModel {@Overrideprotected void productScreen() {System.out.println("聯(lián)想電腦組裝屏幕");}@Overrideprotected void productMouse() {System.out.println("聯(lián)想電腦組裝鼠標(biāo)");}@Overrideprotected void productKeyboard() {System.out.println("聯(lián)想電腦組裝鍵盤");}@Overrideprotected void productHardDisk() {System.out.println("聯(lián)想電腦組裝硬盤");} }HuaweiComputer
/*** @author shuliangzhao* @Title: HuaweiComputer* @ProjectName design-parent* @Description: TODO* @date 2019/5/29 22:51*/ public class HuaweiComputer extends ComputerModel {@Overrideprotected void productScreen() {System.out.println("華為電腦組裝屏幕");}@Overrideprotected void productMouse() {System.out.println("華為電腦組裝鼠標(biāo)");}@Overrideprotected void productKeyboard() {System.out.println("華為電腦組裝鍵盤");}@Overrideprotected void productHardDisk() {System.out.println("華為電腦組裝硬盤");} }ComputerBuilder
/*** @author shuliangzhao* @Title: ComputerBuilder* @ProjectName design-parent* @Description: TODO* @date 2019/5/29 22:51*/ public abstract class ComputerBuilder {//建造一個(gè)模型,你要給我一個(gè)順序要求,就是組裝順序public abstract void setSequence(List<String> sequence);//設(shè)置完畢順序后,就可以直接拿到這個(gè)電腦組裝順序public abstract ComputerModel getComputerModel(); }HuaweiBuilder
/*** @author shuliangzhao* @Title: HuaweiBuilder* @ProjectName design-parent* @Description: TODO* @date 2019/5/29 22:56*/ public class HuaweiBuilder extends ComputerBuilder {private HuaweiComputer huaweiComputer = new HuaweiComputer();@Overridepublic void setSequence(List<String> sequence) {this.huaweiComputer.setSequence(sequence);}@Overridepublic ComputerModel getComputerModel() {return this.huaweiComputer;} }LenovoBuilder
/*** @author shuliangzhao* @Title: LenovoBuilder* @ProjectName design-parent* @Description: TODO* @date 2019/5/29 22:54*/ public class LenovoBuilder extends ComputerBuilder {private LenovoComputer lenovoComputer = new LenovoComputer();@Overridepublic void setSequence(List<String> sequence) {lenovoComputer.setSequence(sequence);}@Overridepublic ComputerModel getComputerModel() {return this.lenovoComputer;} }場(chǎng)景類Director
/*** 場(chǎng)景類可以根據(jù)不同場(chǎng)景組裝電腦* @author shuliangzhao* @Title: Director* @ProjectName design-parent* @Description: TODO* @date 2019/5/29 22:57*/ public class Director {private List<String> sequence = new ArrayList<>();private HuaweiBuilder huaweiBuilder = new HuaweiBuilder();private LenovoBuilder lenovoBuilder = new LenovoBuilder();//組裝華為A系列先屏幕、鼠標(biāo)、鍵盤、硬盤public HuaweiComputer getAHuaweiComputer() {this.sequence.clear();sequence.add("screen");sequence.add("mouse");sequence.add("keyboard");sequence.add("hardDisk");this.huaweiBuilder.setSequence(sequence);return (HuaweiComputer) this.huaweiBuilder.getComputerModel();}//組裝華為B系列先鼠標(biāo)、屏幕、硬盤、鍵盤public HuaweiComputer getBHuaweiComputer() {this.sequence.clear();sequence.add("mouse");sequence.add("screen");sequence.add("hardDisk");sequence.add("keyboard");this.huaweiBuilder.setSequence(sequence);return (HuaweiComputer) this.huaweiBuilder.getComputerModel();}//組裝聯(lián)想A系列先硬盤、鍵盤、鼠標(biāo)、屏幕public LenovoComputer getALenovoComputer() {this.sequence.clear();sequence.add("hardDisk");sequence.add("keyboard");sequence.add("mouse");sequence.add("screen");this.lenovoBuilder.setSequence(sequence);return (LenovoComputer) this.lenovoBuilder.getComputerModel();}//組裝聯(lián)想B系列先鍵盤、鼠標(biāo)、硬盤屏幕public LenovoComputer getBLenovoComputer() {this.sequence.clear();sequence.add("keyboard");sequence.add("mouse");sequence.add("hardDisk");sequence.add("screen");this.lenovoBuilder.setSequence(sequence);return (LenovoComputer) this.lenovoBuilder.getComputerModel();} }客戶端
/*** @author shuliangzhao* @Title: Client* @ProjectName design-parent* @Description: TODO* @date 2019/5/29 23:07*/ public class Client {public static void main(String[] args) {Director director = new Director();//組裝華為A系列10臺(tái)for (int i = 0;i<2;i++) {director.getAHuaweiComputer().assemble();}//組裝聯(lián)想B系列10臺(tái)for (int i=0;i<2;i++) {director.getBLenovoComputer().assemble();}} }運(yùn)行結(jié)果
?
image.png
-
建造者模式優(yōu)點(diǎn):
1.具有封裝性,使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)。
2.建造者獨(dú)立,容易擴(kuò)展
-
建造者模式使用場(chǎng)景:
1.相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的事件結(jié)果時(shí),可以采用建造者模式
2.產(chǎn)品類非常復(fù)雜,或者產(chǎn)品類中的調(diào)用順序不同產(chǎn)生了不同的效能,這個(gè)時(shí)候使用建
造者模式非常合適。
???????
總結(jié)
以上是生活随笔為你收集整理的设计模式 - 建造者模式(Builder Pattern)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式-模板方法(Template M
- 下一篇: 设计模式-原型模式(Prototype)