しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

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

今回はBuilderパターンについて書いていきます。

デザインパターンとは

デザインパターンとはソフトウェア開発の設計方法の事です。
オブジェクト指向における再利用のためのデザインパターン』という本が出典で、全部で23種類のパターンが紹介されています。

Builderパターンとは

Builderパターンとはインスタンスの生成を抽象化するデザインパターンです。
インスタンスの生成を担うBuilderを切り替える事でクライアントは生成処理を考えずにいる事ができます。

SwiftでのBuilderパターンの実装方法

BuilderパターンではDirectorBuilderProductの3つの役割が出てきます。
Productは最終的にインスタンスを生成したいクラスです。
Builderインスタンス生成処理を行うクラスです。
DirectorBuilderを使ってProductを使う役割になります。

実際の実装は下の通りです。
DirectorMyBuilder1を渡した場合とMyBuilder2を渡した場合で結果が異なる事が分かるかと思います。

class Director {
    var builder: Builder
    
    init(builder: Builder) {
        self.builder = builder
    }
    
    func construct() {
        builder.buildeName("Name")
        builder.buildeDescription("Description")
    }
}

protocol Builder {
    func result() -> Product
    func buildeName(name: String)
    func buildeDescription(descirption: String)
}

class MyBuilder1: Builder {
    private let product = Product()
    
    func buildeName(name: String) {
        product.name = name
    }
    
    func buildeDescription(descirption: String) {
        product.description = descirption
    }
    
    func result() -> Product {
        return product
    }
}

class MyBuilder2: Builder {
    private let product = Product()
    
    func buildeName(name: String) {
        product.name = "\(name) by builder2"
    }
    
    func buildeDescription(descirption: String) {
        product.description = "\(descirption) by builder2"
    }
    
    func result() -> Product {
        return product
    }
}

class Product {
    var name: String!
    var description: String!
}

let director1 = Director(builder: MyBuilder1())
let director2 = Director(builder: MyBuilder2())
director1.construct()
director2.construct()
println(director1.builder.result().name) // → Name
println(director2.builder.result().name) // → Name by builder2

オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向における再利用のためのデザインパターン