將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。java
好比一臺電腦包括主機、顯示器、鍵盤等外設,這些部件組成了完整的一臺電腦。如何將這些部件組裝成一臺完整的電腦並返回給用戶,這是建造者模式須要解決的問題。建造者模式(builder)又稱爲生成器模式,從名詞就能夠看出,它是一種較爲複雜、使用頻率也相對較低的建立型模式。建造者模式爲客戶端返回的不是一個簡單的產品,而是一個由多個部件組成的複雜產品。 設計模式
上圖中包含了建造者模式的四個主要角色:微信
下面代碼基於Java實現的一個建造者模式。函數
@data
class Product {
private String name;
private String type;
public void showProduct(){
System.out.println("名稱:"+name);
System.out.println("型號:"+type);
}
}
//抽象類
abstract class Builder {
public abstract void buildPart(String arg1, String arg2);
public abstract Product getProduct();
}
//具體建造者
class ConcreteBuilder extends Builder {
private Product product = new Product();
public Product getResult() {
return product;
}
public void buildPart(String arg1, String arg2) {
product.setName(arg1);
product.setType(arg2);
}
}
// 指揮者
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder=builder;
}
public void setBuilder(Builder builder) {
this.builder=builer;
}
public Product construct(){
builder.buildPart("lenvono","Y470");
return builder.getResult();
}
}
//客戶端調用
public class Client {
public static void main(String[] args){
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.construct();
product1.showProduct();
}
}複製代碼
四個角色都包含在上面的實現中,客戶端進行調用,對於客戶端而言,只需關心具體的建造者便可。在指揮者類中能夠注入一個抽象建造者類型的對象,其核心在於提供了一個建造方法construct(),在該方法中調用了builder對象的構造部件的方法,最後返回一個產品對象。ui
建造者模式的優勢是封裝性好,且易於擴展。上面提到,對於客戶端而言,只需關心具體的建造者便可。使用建造者模式能夠優先的封裝變化,product和builder比較穩定,主要的業務邏輯封裝在控制類中對總體可取得比較好的穩定性。如需擴展,只須要加一個新的建造者,對以前代碼沒有影響。this
與工廠模式相比,建造者模式通常用來建立更爲複雜的對象,由於對象的建立過程更爲複雜,所以將對象的建立過程獨立出來組成一個新的類——指揮者類。也就是說,工廠模式是將對象的所有建立過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;而建造者模式中,建造者類通常只提供產品類中各個組件的建造,而將具體建造過程交付給指揮者類。由指揮者類負責將各個組件按照特定的規則組建爲產品,而後將組建好的產品交付給客戶端。spa
本文講解了設計模式中的建造者模式,大的分類屬於建立型模式。首先介紹了建造者模式的概念;而後給出了建造者模式的類圖,並對其中涉及到的四個角色進行了解釋;又給出了基於Java實現的代碼;最後簡單說了下其優勢,與工廠模式的區別。建造者模式主要適用於建立一些複雜的對象,這些對象的內部組成構件間的建造順序是穩定的,可是對象的內部組成構件面臨着複雜的變化。.net