Builder パターン

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

Builder パターン(ビルダー・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にする。

クラス図[編集]

Builder パターンのクラス図を以下に挙げる。

Builder UML class diagram.svg

利用例[編集]

Java による利用例を以下に挙げる。このソースコードは Java SE 5(J2SE 5.0) 以降のバージョンで動作する。

enum Material{WOOD, CLAY, CONCRETE, SNOW}
class Building{
    private Material base;
    private Material frame;
    private Material wall;
    void setBase(Material m){
        this.base = m;
    }
    void setFrame(Material m){
        this.frame = m;
    }
    void setWall(Material m){
        this.wall = m;
    }
    public String toString(){
        return "[Base:" + this.base + ", Frame:" + this.frame + ", Wall:" + this.wall + "]";
    }
}
interface Builder{
    void buildBase();
    void buildFrame();
    void buildWall();
    Building getResult();
}
class JapaneseHouseBuilder implements Builder{
    private Building building;
    JapaneseHouseBuilder(){
        this.building = new Building();
    }
    public void buildBase(){
        this.building.setBase(Material.CONCRETE);
    }
    public void buildFrame(){
        this.building.setFrame(Material.WOOD);
    }
    public void buildWall(){
        this.building.setWall(Material.CLAY);
    }
    public Building getResult(){
        return this.building;
    }
}
class KamakuraBuilder implements Builder{
    private Building building;
    KamakuraBuilder(){
        this.building = new Building();
    }
    public void buildBase(){
        this.building.setBase(Material.SNOW);
    }
    public void buildFrame(){
        this.building.setFrame(Material.SNOW);
    }
    public void buildWall(){
        this.building.setWall(Material.SNOW);
    }
    public Building getResult(){
        return this.building;
    }
}
class Director{
    private Builder builder;
    Director(Builder builder){
        this.builder = builder;
    }
    Building construct(){
        this.builder.buildBase();
        this.builder.buildFrame();
        this.builder.buildWall();
        return this.builder.getResult();
    }
}
public class BuilderTest{
    public static void main(String[] argv){
        Director d1 = new Director(new JapaneseHouseBuilder());
        Director d2 = new Director(new KamakuraBuilder());
        Building b1 = d1.construct();
        Building b2 = d2.construct();
        System.out.println(b1);
        System.out.println(b2);
    }
}

このソースコードは、以下の結果を出力する。

[Base:CONCRETE, Frame:WOOD, Wall:CLAY]
[Base:SNOW, Frame:SNOW, Wall:SNOW]

Director(監督)の管理の元、それぞれの Builder(大工) が異なる Building(生成物) インスタンスを生成しているのが分かる。

関係するパターン[編集]

Strategy パターン
Builder を Strategy パターンにおける Context として設計することにより、インスタンスの生成過程をより柔軟にすることができる。
Composite パターン
Composite のような複雑な構造を持つインスタンスは、Builder パターンを応用することによって効率的に生成することができる。

関連項目[編集]