
_START_ARTICLE_
Builder パターン
_START_PARAGRAPH_
Builder パターン（ビルダー・パターン）とは、GoF（Gang of Four; 4人のギャングたち）によって定義されたデザインパターンの1つである。 オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にする。
_START_SECTION_
クラス図
_START_PARAGRAPH_
Builder パターンのクラス図を以下に挙げる。
_START_SECTION_
利用例
_START_PARAGRAPH_
Java による利用例を以下に挙げる。このソースコードは Java SE 5(J2SE 5.0) 以降のバージョンで動作する。_NEWLINE__NEWLINE_ enum Material{WOOD, CLAY, CONCRETE, SNOW}_NEWLINE__NEWLINE_ class Building{_NEWLINE_     private Material base;_NEWLINE_     private Material frame;_NEWLINE_     private Material wall;_NEWLINE_     void setBase(Material m){_NEWLINE_         this.base = m;_NEWLINE_     }_NEWLINE_     void setFrame(Material m){_NEWLINE_         this.frame = m;_NEWLINE_     }_NEWLINE_     void setWall(Material m){_NEWLINE_         this.wall = m;_NEWLINE_     }_NEWLINE_     public String toString(){_NEWLINE_         return "[Base:" + this.base + ", Frame:" + this.frame + ", Wall:" + this.wall + "]";_NEWLINE_     }_NEWLINE_ }_NEWLINE__NEWLINE_ interface Builder{_NEWLINE_     void buildBase();_NEWLINE_     void buildFrame();_NEWLINE_     void buildWall();_NEWLINE_     Building getResult();_NEWLINE_ }_NEWLINE__NEWLINE_ class JapaneseHouseBuilder implements Builder{_NEWLINE_     private Building building;_NEWLINE_     JapaneseHouseBuilder(){_NEWLINE_         this.building = new Building();_NEWLINE_     }_NEWLINE_     public void buildBase(){_NEWLINE_         this.building.setBase(Material.CONCRETE);_NEWLINE_     }_NEWLINE_     public void buildFrame(){_NEWLINE_         this.building.setFrame(Material.WOOD);_NEWLINE_     }_NEWLINE_     public void buildWall(){_NEWLINE_         this.building.setWall(Material.CLAY);_NEWLINE_     }_NEWLINE_     public Building getResult(){_NEWLINE_         return this.building;_NEWLINE_     }_NEWLINE_ }_NEWLINE__NEWLINE_ class KamakuraBuilder implements Builder{_NEWLINE_     private Building building;_NEWLINE_     KamakuraBuilder(){_NEWLINE_         this.building = new Building();_NEWLINE_     }_NEWLINE_     public void buildBase(){_NEWLINE_         this.building.setBase(Material.SNOW);_NEWLINE_     }_NEWLINE_     public void buildFrame(){_NEWLINE_         this.building.setFrame(Material.SNOW);_NEWLINE_     }_NEWLINE_     public void buildWall(){_NEWLINE_         this.building.setWall(Material.SNOW);_NEWLINE_     }_NEWLINE_     public Building getResult(){_NEWLINE_         return this.building;_NEWLINE_     }_NEWLINE_ }_NEWLINE__NEWLINE_ class Director{_NEWLINE_     private Builder builder;_NEWLINE_     Director(Builder builder){_NEWLINE_         this.builder = builder;_NEWLINE_     }_NEWLINE_     Building construct(){_NEWLINE_         this.builder.buildBase();_NEWLINE_         this.builder.buildFrame();_NEWLINE_         this.builder.buildWall();_NEWLINE_         return this.builder.getResult();_NEWLINE_     }_NEWLINE_ }_NEWLINE__NEWLINE_ public class BuilderTest{_NEWLINE_     public static void main(String[] argv){_NEWLINE_         Director d1 = new Director(new JapaneseHouseBuilder());_NEWLINE_         Director d2 = new Director(new KamakuraBuilder());_NEWLINE_         Building b1 = d1.construct();_NEWLINE_         Building b2 = d2.construct();_NEWLINE_         System.out.println(b1);_NEWLINE_         System.out.println(b2);_NEWLINE_     }_NEWLINE_ }_NEWLINE_このソースコードは、以下の結果を出力する。_NEWLINE__NEWLINE_[Base:CONCRETE, Frame:WOOD, Wall:CLAY]_NEWLINE_[Base:SNOW, Frame:SNOW, Wall:SNOW]_NEWLINE_Director (監督) の管理の元、それぞれのBuilder (大工) が異なるBuilding (生成物) インスタンスを生成しているのが分かる。