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 パターンを応用することによって効率的に生成することができる。

関連項目[編集]