1. 程式人生 > >初識設計模式(建造者模式)

初識設計模式(建造者模式)

auth div bsp ddp des print 生成 pub 定義

前言:繼續學習設計模式,今天學習建造者模式。

建造者模式(Builder Pattern)

定義

  又叫生成器模式。將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

設計原則

  依賴倒轉原則,抽象不應該依賴細節,細節應該依賴抽象。

目的

  如果我們用了建造者模式,那麽用戶就只需要指定需要建造的類型就可以得到他們,而具體建造的過程和細節就不需要知道了。

什麽時候使用

  主要用於創建一些復雜的對象,這些對象內部構建間的建造順序通常是穩定的(產品對象具有共性),但對象內部的構建通常面臨著復雜的變化。

好處

  使得建造者代碼與表示代碼分離,達到解耦。

  由於建造者隱藏了該產品是如何組裝的,所以若要改變一個產品的內部表示,只需要再定義一個具體的建造者就可以了,符合“開閉原則”。

  將復雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰,易於精確控制對象的創建。

缺點

  建造者模式所創建的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。

  如果產品的內部變化復雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。

結構圖

技術分享圖片

基本代碼

具體產品

package designpatterns.builder;

import java.util.ArrayList;
import java.util.List;

/**
 * 具體產品
 * @author yule
 * @date 2018/8/12 13:32
 
*/ public class Product { private List<String> parts = new ArrayList<>(); /** * 添加產品部件 * @param part */ public void addPart(String part){ parts.add(part); } /** * 列舉所有產品部件 */ public void show(){ System.out.println("產品創建:");
for(String part : parts){ System.out.println(part); } } }

創建抽象建造者,假設一個產品需要partA,partB組成

package designpatterns.builder;

/**
 * 抽象建造者
 * @author yule
 * @date 2018/8/12 13:36
 */
public abstract class Builder {
    public abstract void builderPartA();
    public abstract void builderPartB();

    public abstract Product getProduct();
}

創建具體建造者1

package designpatterns.builder;

/**
 * 具體建造者1
 * @author yule
 * @date 2018/8/12 13:37
 */
public class ConcreteBuilder1 extends Builder{

    private Product product = new Product();

    @Override
    public void builderPartA() {
        product.addPart("部件A1");
    }

    @Override
    public void builderPartB() {
        product.addPart("部件B1");
    }

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

創建具體建造者2

package designpatterns.builder;

/**
 * 具體建造者2
 * @author yule
 * @date 2018/8/12 13:39
 */
public class ConcreteBuilder2 extends Builder{

    private Product product = new Product();

    @Override
    public void builderPartA() {
        product.addPart("部件A2");
    }

    @Override
    public void builderPartB() {
        product.addPart("部件B2");
    }

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

創建指揮者,用來指揮創建過程

package designpatterns.builder;

/**
 * 指揮者,用來指揮創建過程
 * @author yule
 * @date 2018/8/12 13:40
 */
public class Director {
    public void Construct(Builder builder){
        builder.builderPartA();
        builder.builderPartB();
    }
}

客戶端代碼,客戶不需要知道具體的建造過程

    public static void main(String[] args){
        Director director = new Director();

        Builder builder1 = new ConcreteBuilder1();
        director.Construct(builder1);
        Product product1 = builder1.getProduct();
        product1.show();

        Builder builder2 = new ConcreteBuilder2();
        director.Construct(builder2);
        Product product2 = builder2.getProduct();
        product2.show();
    }

初識設計模式(建造者模式)