builder pattern
obejectのセットアップ過程を切り出す。
ケース
オブジェクトの内部表現が
多岐にわたるときや
構造が複雑なとき。
結果
pros
生成したいオブジェクトの内部表現が切り出され、変更が容易になる。
cons
ない。
実装対象
生成したいオブジェクト(product)の内部表現を変更するインターフェイス(Builder)
生成したいオブジェクト(product)の内部表現を変更するオペレーション(ConcreteBuilder)
Builderインターフェイスの使い方を実装するクラス(Director)
example
Roomを作る例。
protocol RoomBuilderProtocol {
// sideCount 角形の床を設置する
func buildFloor(at story: Int, sideCount: Int)
func buildWall(for side: Int)
}
class RoomBuilder: RoomBuilderProtocol {
func buildFloor(sideCount: Int) {
room.floor = Floor(sideCount: sideCount)
}
func buildWall(for side: Int) {
let wall = Wall()
room.walls.append(wall)
room.floor.setWall(wall, for: side)
}
var room = Room()
}
class Director {
func constructNormalRoom(builder: RoomBuilderProtocol) {
// 四角形の床
builder.buildFloor(sideCount: 4)
// 全面に壁を設置
builder.buildWall(for: 0)
builder.buildWall(for: 1)
builder.buildWall(for: 2)
builder.buildWall(for: 3)
}
func constructStrangeRoom(builder: RoomBuilderProtocol) {
// 5角形の床
builder.buildFloor(sideCount: 5)
// 1面にだけ壁を設置
builder.buildWall(for: 0)
}
}
let builder = RoomBuilder()
let director = Director()
director.constructNormalRoom(builder: builder)
let normalRoom = builder.room
let builder2 = RoomBuilder()
director.constructStrangeRoom(builder: builder2)
let strangeRoom = builder2.room
Directorクラスはbuilderのインターフェイスを利用するだけに留まっている。
最終成果物はdirectorから取得するのではなく、builderから取得することに注意。