1. 定義
指將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示,這樣的設(shè)計(jì)模式被稱為建造者模式。它是將一個(gè)復(fù)雜的對(duì)象分解為多個(gè)簡(jiǎn)單的對(duì)象伦籍,然后一步一步構(gòu)建而成。它將變與不變相分離腮出,即產(chǎn)品的組成部分是不變的帖鸦,但每一部分是可以靈活選擇的。
2. 特點(diǎ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ù)成本較大绣夺。
3. 結(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)品的信息。
4. 實(shí)現(xiàn)
(1) 產(chǎn)品角色:包含多個(gè)組成部件的復(fù)雜對(duì)象蛾狗。
class Product {
private String partA;
private String partB;
private String partC;
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
public void setPartC(String partC) {
this.partC = partC;
}
public void show() {
//顯示產(chǎn)品的特性
}
}
(2) 抽象建造者:包含創(chuàng)建產(chǎn)品各個(gè)子部件的抽象方法晋涣。
abstract class Builder {
//創(chuàng)建產(chǎn)品對(duì)象
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//返回產(chǎn)品對(duì)象
public Product getResult() {
return product;
}
}
(3) 具體建造者:實(shí)現(xiàn)了抽象建造者接口。
public class ConcreteBuilder extends Builder {
public void buildPartA() {
product.setPartA("建造 PartA");
}
public void buildPartB() {
product.setPartB("建造 PartB");
}
public void buildPartC() {
product.setPartC("建造 PartC");
}
}
(4) 指揮者:調(diào)用建造者中的方法完成復(fù)雜對(duì)象的創(chuàng)建沉桌。
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
//產(chǎn)品構(gòu)建與組裝方法
public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
(5) 客戶類谢鹊。
public class Client {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.construct();
product.show();
}
}