0
0

More than 1 year has passed since last update.

【デザインパターン】Builder

Posted at

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;
	}
}

構造

  1. Builder: 各プロダクトに共通する構築ステップの宣言します。
  2. Concrete Builder: 様々な構築ステップの実装を行います。インターフェース外のプロダクトの産出も可能です。
  3. Product: 生成されるオブジェクトです。インターフェースで定義する必要はありません。
  4. Director: 構築ステップを呼ぶ順番を定義することで、Productの特定の設定を再利用できます。厳密には必須ではありません。
  5. 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を切り離すことができる。

短所

  • 複数のクラスを作らなければならず、全体的にコードが複雑化する。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0