LoginSignup
0
0

More than 3 years have passed since last update.

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から取得することに注意。

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