Builderとは
Builderはデザインパターンのうち、生成のパターンに分類される一つであり、複雑なオブジェクトを段階的に生成します。今パターンでは異なる型や様々な表現を持つオブジェクトを一つのBuilderで生成できます。
問題点
フィールドが多数になると、コンストラクタのパラメータが増えてきます。また、必須でないフィールドが多くあると、冗長的なコンストラクタとなります。
public class House{
public int roof;
public int wall;
public int floor;
public int door;
public int window;
public int stair;
public House(int roof, int wall, int floor, int door, int window, int stair){
this.roof = roof;
this.wall = wall;
this.floor = floor;
this.door = door;
this.window = window;
this.stair = stair;
}
}
構造
- Builder: 各プロダクトに共通する構築ステップの宣言します。
- Concrete Builder: 様々な構築ステップの実装を行います。インターフェース外のプロダクトの産出も可能です。
- Product: 生成されるオブジェクトです。インターフェースで定義する必要はありません。
- Director: 構築ステップを呼ぶ順番を定義することで、Productの特定の設定を再利用できます。厳密には必須ではありません。
- Client: Concrete BuilderとDirectorを関連付ける役割を果たします。
public class House{
public int roof;
public int wall;
public int floor;
public int door;
public int window;
public int stairs;
}
public interface Builder{
public void readd();
public void addRoof(int roof);
public void addWall(int wall);
public void addFloor(int floor);
public void addDoor(int door);
public void addStair(int stair);
public void addWindow(int window);
}
public HouseBuilder implements Builder{
private House house;
public HouseBuilder(){
this.readd();
}
public void readd(){
this.house = new House();
}
public void addRoof(){
house.roof++;
}
public void addFloor(){
house.floo++;
}
public void addDoor(){
house.door++;
}
public void addWindow(){
house.window++;
}
public void addStair(){
house.stair++;
}
public House getProduct(){
House product = this.house;
this.readd();
return product;
}
}
public class Director{
public void constructOneStory(Builder builder){
this.builder.addFloor();
this.builder.addWall();
this.builder.addRoof();
this.builder.addDoor();
}
public void constructTwoStory(Builder builder){
this.builder.readd();
this.builder.addFloor();
this.builder.addWall();
this.builder.addRoof();
this.builder.addDoor();
this.builder.addStair();
}
}
public class Client{
public void createHouses(){
Director director = new Director();
HouseBuilder houseBuilder = new HouseBuilder();
director.constructOneStory(houseBuilder);
House house = houseBuilder.getProduct();
HouseBuilder houseBuilder = new HouseBuilder();
director.constructOneStory(houseBuilder);
House house = houseBuilder.getProduct();
}
}
長所と短所
長所
- 段階的な生成が可能となり、再帰的にステップを呼び出すことができる。
- 様々な形式のプロダクトを同じbuilderで表現することができる。
- 複雑化したconstructionを切り離すことができる。
短所
- 複数のクラスを作らなければならず、全体的にコードが複雑化する。