設計模式學習--Builder

What

Builder:將一個複雜的對象的構建和表示分離,使得一樣的構建過程能夠建立不一樣的表示。html

Why

Builder也是建立型模式的一種,它是一步一步的嚮導式的建立一個複雜的對象,Builder接口定義建立複雜對象的零部件,Director根據客戶端端傳入的builder按照必定的步驟建立完成複雜對象的建立。
Builder適用於比較複雜的對象的建立,該對象的建立有比較穩定的步驟或者比較穩定的「零件」,可是「零件」(步驟)內部的構建是複雜多變的。
設計模式書中Builder適用於以下狀況:
一、當建立複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
二、當構造過程必須容許被構造的對象有不一樣的表示時。算法

How

假設以下場景,須要構造一個汽車類,汽車有輪子,方向盤,發動機,不一樣品牌的汽車零件算法不一樣。以此爲示例,使用builder模式實現。
汽車builder接口設計模式

public abstract class CarBuilder {

    protected Car car=null;

    public abstract void buildWheel();

    public abstract void buildEngine();

    public abstract void buildSteeringWheel();

    public Car getResult(){
        return car;
    }
}

Jeep汽車builder實現app

public class JeepCarBuilder extends CarBuilder {

    @Override
    public void buildWheel() {
        System.out.println("construct jeep car wheel");
    }

    @Override
    public void buildEngine() {
        System.out.println("construct jeep car engine");
    }

    @Override
    public void buildSteeringWheel() {
        System.out.println("construct jeep car steering wheel");
    }
}

Chery汽車builder實現ide

public class CheryCarBuilder extends CarBuilder {

    @Override
    public void buildWheel() {
        System.out.println("construct chery car wheel");
    }

    @Override
    public void buildEngine() {
        System.out.println("construct chery car engine");
    }

    @Override
    public void buildSteeringWheel() {
        System.out.println("construct chery steering wheel");
    }
}

Director實現ui

public class CarDirector {

    private CarBuilder builder;

    public CarDirector(CarBuilder builder){
        this.builder=builder;
    }

    public Car construct(){
        builder.buildSteeringWheel();
        builder.buildEngine();
        builder.buildWheel();
        return builder.getResult();
    }
}

Client調用this

public class App {

    public static void main( String[] args ){

        CarBuilder builder=new JeepCarBuilder();
        CarDirector director=new CarDirector(builder);
        director.construct();

        CarBuilder builder1=new CheryCarBuilder();
        CarDirector director1=new CarDirector(builder1);
        director1.construct();
    }
}

本示例類圖以下:spa


Discuss

Builder模式的好處是使建造代碼與表示代碼分離,若是須要增長系列產品,只須要增長相應的builder接口實現便可,若是須要改變產品的表示,也只需修改builder接口的實現便可。
在jdk中,StringBuilder是一個簡易版的builder模式,其中StringBuilder充當了builder以及construct的角色,Client充當了Director。
類圖以下(來自happyhippy's Blog):

設計

Reference

一、Builder模式的誤區:將複雜對象的構建進行封裝,就是Builder模式了嗎?code

相關文章
相關標籤/搜索