建造者模式(Builder Pattern):將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離墨缘,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
模式結(jié)構(gòu)
-Builder:抽象建造者
-ConcreteBuilder:具體建造者
-Director:指揮者
-Product:產(chǎn)品角色
UML
代碼分析
/**
* Created by TigerChain
* 替代多參構(gòu)造方法--建造者模式
*/
public class ComputerB {
private String mainBoard ; // 主板
private String cpu ; // cpu
private String hd ; // 硬盤
private String powerSupplier ; // 電源
private String graphicsCard; // 顯卡
// 其它一些可選配置
private String mouse ; // 鼠標(biāo)
private String computerCase ; //機(jī)箱
private String mousePad ; //鼠標(biāo)墊
private String other ; //其它配件
// ComputerB 自己充當(dāng) Director
private ComputerB(ComputerBuilder builder) {
this.mainBoard = builder.mainBoard ;
this.cpu = builder.cpu ;
this.hd = builder.hd ;
this.powerSupplier = builder.powerSupplier ;
this.graphicsCard = builder.graphicsCard ;
this.mouse = builder.mouse ;
this.computerCase = builder.computerCase ;
this.mousePad = builder.mousePad ;
this.other = builder.other ;
}
// 聲明一個(gè)靜態(tài)內(nèi)存類 Builder
public static class ComputerBuilder{
// 一個(gè)電腦的必須配置
private String mainBoard ; // 主板
private String cpu ; // cpu
private String hd ; // 硬盤
private String powerSupplier ; // 電源
private String graphicsCard; // 顯卡
// 其它一些可選配置
private String mouse ; // 鼠標(biāo)
private String computerCase ; //機(jī)箱
private String mousePad ; //鼠標(biāo)墊
private String other ; //其它配件
// 這里聲明一些必須要傳的參數(shù)「規(guī)定這些參數(shù)是必須傳的锦秒,這里只是舉例旋炒,再實(shí)中可能參數(shù)都是可選的」
public ComputerBuilder(String mainBoard,String cpu,String hd,String powerSupplier,String graphicsCard){
this.mainBoard = mainBoard ;
this.cpu = cpu ;
this.hd = hd ;
this.powerSupplier = powerSupplier ;
this.graphicsCard = graphicsCard ;
}
public ComputerBuilder setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
return this ;
}
public ComputerBuilder setCpu(String cpu) {
this.cpu = cpu;
return this ;
}
// 生成最終的產(chǎn)品
public ComputerB build(){
return new ComputerB(this) ;
}
}
}
優(yōu)點(diǎn)
1尤泽、使創(chuàng)建產(chǎn)品的步驟「把創(chuàng)建產(chǎn)品步驟放在不同的方法中歌逢,更加清晰直觀」和產(chǎn)品本身分離,即使用相同的創(chuàng)建過程要吧創(chuàng)建出不同的產(chǎn)品
2翘狱、每個(gè)建造者都是獨(dú)立的互不影響秘案,這樣就達(dá)到解耦的目的,所以如果想要替換現(xiàn)有的建造者那非常方便潦匈,添加一個(gè)實(shí)現(xiàn)即可阱高。
缺點(diǎn)
1、如果一個(gè)對象有非常復(fù)雜的內(nèi)部結(jié)構(gòu)「這些產(chǎn)品通常有很多屬性」茬缩,那么使用建造者模式
2赤惊、如果想把復(fù)雜對象的創(chuàng)建和使用分離開來,那么使用建造者模式「使用相同的創(chuàng)建步驟可以創(chuàng)建不同的產(chǎn)品」
參考博客
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html
https://juejin.im/post/5a23bdd36fb9a045272568a6