建造者模式(Builder Pattern)使用多個簡單的對象一步一步建構成一個複雜的對象。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。
一個 Builder 類會一步一步構造最終的對象。該 Builder 類是獨立于其他對象的。
介紹
意圖:将一個複雜的建構與其表示相分離,使得同樣的建構過程可以建立不同的表示。
主要解決:主要解決在軟體系統中,有時候面臨着"一個複雜對象"的建立工作,其通常由各個部分的子對象用一定的算法構成;由于需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是将它們組合在一起的算法卻相對穩定。
何時使用:一些基本部件不會變,而其組合經常變化的時候。
如何解決:将變與不變分離開。
關鍵代碼:建造者:建立和提供執行個體,導演:管理建造出來的執行個體的依賴關系。
應用執行個體: 1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。 2、JAVA 中的 StringBuilder。
優點: 1、建造者獨立,易擴充。 2、便于控制細節風險。
缺點: 1、産品必須有共同點,範圍有限制。 2、如内部變化複雜,會有很多的建造類。
使用場景: 1、需要生成的對象具有複雜的内部結構。 2、需要生成的對象内部屬性本身互相依賴。
注意事項:與工廠模式的差別是:建造者模式更加關注與零件裝配的順序。
模式的結構與實作
建造者(Builder)模式由産品、抽象建造者、具體建造者、指揮者等 4 個要素構成,現在我們來分析其基本結構和實作方法。
1. 模式的結構
建造者(Builder)模式的主要角色如下。
- 産品角色(Product):它是包含多個組成部件的複雜對象,由具體建造者來建立其各個零部件。
- 抽象建造者(Builder):它是一個包含建立産品各個子部件的抽象方法的接口,通常還包含一個傳回複雜産品的方法 getResult()。
- 具體建造者(Concrete Builder):實作 Builder 接口,完成複雜産品的各個部件的具體建立方法。
- 指揮者(Director):它調用建造者對象中的部件構造與裝配方法完成複雜對象的建立,在指揮者中不涉及具體産品的資訊。
其結構圖如圖 1 所示。
圖1 建造者模式的結構圖
2. 模式的實作
圖 1 給出了建造者(Builder)模式的主要結構,其相關類的代碼如下。
(1) 産品角色:包含多個組成部件的複雜對象。
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() {
//顯示産品的特性
}
}
(2) 抽象建造者:包含建立産品各個子部件的抽象方法。
abstract class Builder {
//建立産品對象
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//傳回産品對象
public Product getResult() {
return product;
}
}
(3) 具體建造者:實作了抽象建造者接口。
public class ConcreteBuilder extends Builder {
public void buildPartA() {
product.setPartA("建造 PartA");
}
public void buildPartB() {
product.setPartB("建造 PartB");
}
public void buildPartC() {
product.setPartC("建造 PartC");
}
}
(4) 指揮者:調用建造者中的方法完成複雜對象的建立。
class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
//産品建構與組裝方法
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();
}
}
轉載:http://c.biancheng.net/view/1354.html