1. 程式人生 > >【Java設計模式】:建立型模式—建造者模式

【Java設計模式】:建立型模式—建造者模式

1.建造者模式定義

建造者模式,顧名思義的就是類似建房子,有一個固定的流程。在大話設計模式中,作者舉了一個例子大概意思是同一道菜在中國的每一個地方都有不同的味道(LZ印象最深的是酸菜魚,來杭州之後印象最深刻的是清蒸鱸魚。),而肯德基的雞腿、漢堡在每一個城市都是一樣的味道。建造者模式實現了依賴倒轉原則,抽象不應該依賴細節,細節應該依賴與抽象。建造者模式的定義是:將一個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示,這樣的設計模式被稱為建造者模式。

2.建造者模式的4個角色

建造者模式的角色定義,在建造者模式中存在以下4個角色:

  1. builder:為建立一個產品物件的各個部件指定抽象介面。
  2. ConcreteBuilder:實現Builder的介面以構造和裝配該產品的各個部件,定義並明確它所建立的表示,並提供一個檢索產品的介面。
  3. Director:構造一個使用Builder介面的物件。
  4. Product:表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的介面。

3.建造者模式UML圖

在這裡插入圖片描述

4.建造者模式程式碼

建造者模式我們就以建房子這一個工程為例子寫程式吧。這一過程為打樁建立基礎、砌牆、封頂。不管是普通房子也好,別墅也好都需要經歷這一過程,符合我們的建設。

具體的產品Product

package com.roc.build;
/**
 * 具體的產品---房子
 * @author liaowp
 *
 */
public class Product {
    private String basic;//地基
    
    private String walls;//牆
    
    private String roofed;//樓頂

    public String getBasic() {
        return basic;
    }

    public void setBasic(String basic) {
this.basic = basic; } public String getWalls() { return walls; } public void setWall(String walls) { this.walls = walls; } public String getRoofed() { return roofed; } public void setRoofed(String roofed) { this.roofed = roofed; } }

抽象Builder建造:

package com.roc.build;
/**
 * 抽象建造
 * @author liaowp
 *
 */
public interface Builder {

    /**
     * 打基礎
     */
    public void  buildBasic();
    
    /**
     * 砌牆
     */
    public void  buildWalls();
    
    /**
     * 封頂
     */
    public void  roofed();
    
    /**
     * 造房子
     * @return
     */
    public Product buildProduct();
}

具體的ConcreteBuilder建造:

package com.roc.build;
/**
 * 具體的建造
 * @author liaowp
 *
 */
public class ConcreteBuilder implements Builder{
    
    private Product product;
    
    public ConcreteBuilder(){
        product=new Product();
    }
    
    @Override
    public void buildBasic() {
        product.setBasic("打好基礎");
    }

    @Override
    public void buildWalls() {
        product.setWalls("砌牆");
    }

    @Override
    public void roofed() {
        product.setRoofed("封頂大吉");
    }

    @Override
    public Product buildProduct() {
        return product;
    }

}

建造者:

package com.roc.build;
/**
 * 建造者
 * @author liaowp
 *
 */
public class Director {
    
    public Product constructProduct(ConcreteBuilder concreteBuilder){
        concreteBuilder.buildBasic();
        concreteBuilder.buildWalls();
        concreteBuilder.roofed();
        return concreteBuilder.buildProduct();
    }
}

測試類

package com.roc.build;
/**
 * 建造者
 * @author liaowp
 *  */
public class Director {
    public static void main(String[] args){
      ConcreteBuilder concreteBuilder = new ConreteBuilder();
      Product product = new Director().constructProduct(concreteBuilder);
      System.out.println(product.getBasic());
      System.out.println(product.getWalls());
      System.out.println(product.getRoofted());
    }
}

5.建造者模式優缺點

優點

  • 易於解耦:將產品本身與產品建立過程進行解耦,可以使用相同的建立過程來得到不同的產品。也就說細節依賴抽象。
  • 易於精確控制物件的建立:將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰。
  • 易於拓展:增加新的具體建造者無需修改原有類庫的程式碼,易於拓展,符合“開閉原則“。

每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,使用者使用不同的具體建造者即可得到不同的產品物件。

缺點

  • 建造者模式所建立的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。
  • 如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。

6.應用場景

  1. 需要生成的產品物件有複雜的內部結構,這些產品物件具備共性;
  2. 隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同的產品。