如果大家對java架構相關感興趣,可以關注下面公衆號,會持續更新java基礎面試題, netty, spring boot,spring cloud等系列文章,一系列乾貨隨時送達, 超神之路從此展開, BTAJ不再是夢想!
概述
建造者模式屬於創建型設計模式,它主要是將一個複雜對象的構建與表示分離,使用多個簡單的對象一步一步構建成一個複雜的對象,它提供了一種創建對象的最佳方式。
建造者模式將複雜產品的構建過程封裝在不同的方法中,使得創建過程非常清晰,能夠讓我們更加精確的控制複雜產品對象的創建過程,同時它隔離了複雜產品對象的創建和使用,使得相同的創建過程能夠創建不同的產品。
但是如果某個產品的內部結構過於複雜,將會導致整個系統變得非常龐大,不利於控制,同時若干個產品之間存在較大的差異,則不適用建造者模式。其UML結構圖如下:
1、定義:將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示
2、主要作用:在用戶不知道對象的建造過程和細節的情況下就可以直接創建複雜的對象。
3、如何使用:用戶只需要給出指定複雜對象的類型和內容,建造者模式負責按順序創建複雜對象(把內部的建造過程和細節隱藏起來)
4、解決的問題:
(1)、方便用戶創建複雜的對象(不需要知道實現過程)
(2)、代碼複用性 & 封裝性(將對象構建過程和細節進行封裝 & 複用)
5、注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序,一般用來創建更爲複雜的對象
四個角色
- Product(產品對象):一個具體的產品對象
- Bulider(抽象建造者):創建一個Product對象的各個部件指定的 接口/抽象類 。指定建造流程
- ConcreteBulider(具體建造者):實現接口,構建和裝配各個部件
- Director(指揮者):構建一個使用Bulider接口的對象,它主要是用於創建一個複雜的對象,它隔離了客戶和對象的生產過程,還負責控制整個產品對象的生產過程
示例
Product
public class Product
{
private String partA; //可以是任意類型
private String partB;
private String partC;
public String getPartA()
{
return partA;
}
public void setPartA(String partA)
{
this.partA = partA;
}
public String getPartB()
{
return partB;
}
public void setPartB(String partB)
{
this.partB = partB;
}
public String getPartC()
{
return partC;
}
public void setPartC(String partC)
{
this.partC = partC;
}
@Override
public String toString()
{
return "Product [partA=" + partA + ", partB=" + partB + ", partC=" + partC + "]";
}
}
Builder
public 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;
}
}
ConcreteBuilder
public class ConcreteBuilder extends Builder {
@Override
public void buildPartA()
{
product.setPartA("A產品");
System.out.println("創建A產品...");
}
@Override
public void buildPartB()
{
product.setPartB("B產品");
System.out.println("創建B產品...");
}
@Override
public void buildPartC()
{
product.setPartC("C產品");
System.out.println("創建C產品...");
}
}
Director
public class Director {
private Builder builder;
//1 構造方法的方式注入builder對象
public Director(Builder builder)
{
this.builder = builder;
}
//2 set方法注入builder對象
public void setBuilder(Builder builder)
{
this.builder = builder;
}
public Product construct()
{
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
BuilderPatternDemo
public class BuilderPatternDemo {
public static void main(String[] args)
{
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.construct();
System.out.println(product);
}
}
輸出
創建A產品...
創建B產品...
創建C產品...
Product [partA=A產品, partB=B產品, partC=C產品]
優點
- 使用建造者模式可以使客戶端不必知道產品內部組成的細節。
- 具體的建造者類之間是相互獨立的,這有利於系統的擴展。
- 具體的建造者相互獨立,因此可以對建造的過程逐步細化,而不會對其他模塊產生任何影響。
缺點
- 建造者模式所創建的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。
- 如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。
應用場景
-
當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
-
當複雜對象的部件相對穩定,不會發生變化時。
建造者模式與抽象工廠模式的比較
- 與抽象工廠模式相比,建造者模式返回一個組裝好的完整產品,而抽象工廠模式返回一系列相關的產品,這些產品位於不同的產品等級結構,構成了一個產品族 。
- 在抽象工廠模式中,客戶端實例化工廠類,然後調用工廠方法獲取所需產品對象,而在建造者模式中,客戶端可以不直接調用建造者的相關方法,而是通過指揮者類來指導如何生成對象,包括對象的組裝過程和建造步驟,它側重於一步步構造一個複雜對象,返回一個完整的對象 。
- 如果將抽象工廠模式看成汽車配件生產工廠,生產一個產品族的產品,那麼建造者模式就是一個汽車組裝工廠,通過對部件的組裝可以返回一輛完整的汽車.
如果大家對java架構相關感興趣,可以關注下面公衆號,會持續更新java基礎面試題, netty, spring boot,spring cloud等系列文章,一系列乾貨隨時送達, 超神之路從此展開, BTAJ不再是夢想!