Builder

デザインパターンとは

デザインパターンとはオブジェクト思考開発における先人たちが作り上げてきた便利な設計図です。

Gang of Four通称Gofが1994年に出版した『オブジェクト指向における再利用のためのデザインパターン』の中で23個の設計図が紹介されています。

Note

デザインパターンのサンプルコードはSwift4でまとめます。

ビルダーパターンとは?

 ビルダーパターンはインスタンスの生成を抽象化するパターンです。

登場する概念クラスは3つで、ProductBuilderDirectorです。

Productは生成したいクラスです。DirectorはBuilderを使ってProductを生成します。ProductとDirectorは1つづつですが、Builderは複数存在します。

サンプルコード

サンプルでは3びきのこぶたを例にBuilderパターンを解説していきます。 

Product

Productはぶたの兄弟が作る家です。なんの素材で作られているのかと耐久度をメンバに持っています。

class PigHouse {
    var material: String
    var durability: Int
    init(material: String, durability: Int) {
        self.material = material
        self.durability = durability
    }
}

Director

Directorはオオカミです。オオカミは家を吹き飛ばすメソッドとターゲットにするブタの家をメンバに持っておきます。

class Wolf {
    var target: Builder
    init(pigHouse: Builder) {
        target = pigHouse
    }
    func blowOff(){
        target.houseDurability(damage: 50)
    }
}

Builder

Builderはブタです。本来は3びきですが、2匹いれば解説できるので藁の家を作ったブタとレンガの家を作ったブタのBuilderクラスを作成しました。

class pigBuilder1: Builder {
    let house = PigHouse(material: "藁", durability: 20)
    
    func houseDurability(damage: Int){
        house.durability -= damage
    }
    func result() -> String{
        if house.durability > 0 {
            return "家は無事です!!!"
        }
        return "家が壊れてしまいました"
    }
}
class pigBuilder2: Builder {
    let house = PigHouse(material: "レンガ", durability: 100)
    
    func houseDurability(damage: Int){
        house.durability -= damage
    }
    func result() -> String{
        if house.durability > 0 {
            return "家は無事です!!!"
        }
        return "家が壊れてしまいました"
    }
}

呼び出し部分

//藁の家を狼が吹き飛ばす
let wolf1 = Wolf(pigHouse: pigBuilder1())
wolf1.blowOff()
print("藁の家は\(wolf1.target.result())")


//レンガの家を狼が吹き飛ばす
let wolf2 = Wolf(pigHouse: pigBuilder2())
wolf2.blowOff()
print("レンガの家は\(wolf2.target.result())") 

コンソールにはこのように出力されます。

藁の家は家が壊れてしまいました
レンガの家は家は無事です!!!

参考文献

Swiftで学ぶデザインパターン15 (Builderパターン)

Builder パターン

デザインパターン

前の記事

Factory Method
デザインパターン

次の記事

Memento