「Builder パターン」の版間の差分
表示
削除された内容 追加された内容
→利用例: シンタックスハイライトを使用。 |
|||
10行目: | 10行目: | ||
[[Java]] による利用例を以下に挙げる。このソースコードは [[Java Platform, Standard Edition|Java SE 5(J2SE 5.0)]] 以降のバージョンで動作する。 |
[[Java]] による利用例を以下に挙げる。このソースコードは [[Java Platform, Standard Edition|Java SE 5(J2SE 5.0)]] 以降のバージョンで動作する。 |
||
< |
<syntaxhighlight lang="java"> |
||
enum Material{WOOD, CLAY, CONCRETE, SNOW} |
enum Material{WOOD, CLAY, CONCRETE, SNOW} |
||
99行目: | 99行目: | ||
} |
} |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
このソースコードは、以下の結果を出力する。 |
このソースコードは、以下の結果を出力する。 |
||
< |
<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 パターンを応用することによって効率的に生成することができる。