コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「Builder パターン」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
利用例: シンタックスハイライトを使用。
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
 
10行目: 10行目:
[[Java]] による利用例を以下に挙げる。このソースコードは [[Java Platform, Standard Edition|Java SE 5(J2SE 5.0)]] 以降のバージョンで動作する。
[[Java]] による利用例を以下に挙げる。このソースコードは [[Java Platform, Standard Edition|Java SE 5(J2SE 5.0)]] 以降のバージョンで動作する。


<source lang="java">
<syntaxhighlight lang="java">
enum Material{WOOD, CLAY, CONCRETE, SNOW}
enum Material{WOOD, CLAY, CONCRETE, SNOW}


99行目: 99行目:
}
}
}
}
</syntaxhighlight>
</source>


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


<source lang="text">
<syntaxhighlight lang="text">
[Base:CONCRETE, Frame:WOOD, Wall:CLAY]
[Base:CONCRETE, Frame:WOOD, Wall:CLAY]
[Base:SNOW, Frame:SNOW, Wall:SNOW]
[Base:SNOW, Frame:SNOW, Wall:SNOW]
</syntaxhighlight>
</source>


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

2020年7月5日 (日) 22:50時点における最新版

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

クラス図

[編集]

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

利用例

[編集]

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

関連項目

[編集]