Swift: デザインパターン > 生成パターン > Builder

オブジェクト設計において、定石となる手法をパターン化したものを デザインパターン といいます。
デザインパターンをきちんと勉強していない人でも、Web のおかげで知らず知らずのうちに使って(コピペして)その恩恵を享受しています。

自分自身パターン概要を一読しただけで、あいまいな使い方をしているものが多く、この際勉強を兼ねて GOF 23 パターンのなかでよく利用するものを Swift3 で記述していきたいと思います。

今回は 生成パターンBuilder について説明します。

目次

  • [生成] Builder パターン
  • まとめ

[生成] Builder パターン

Builder はオブジェクトの生成(建築)過程を抽象化し、動的にオブジェクトを生成(建築)することを可能にするパターンです。

パターンの概要

Director
Builder に提供されているインタフェースを使用しオブジェクトを生成(建築)する。
Builder
オブジェクト生成(建築)過程のインターフェースを定義する。
ConcreteBuilder
Builder が定義したインターフェースを実装する。
Product
Builder により生成されたオブジェクト(成果物)。

サンプルコード

Director.swift

// Builder クラスのインタフェースを使って Product を生成するクラス
class Director: NSObject {
    let builder: Builder
    
    init(builder: Builder) {
        self.builder = builder
    }
    
    func construct() {
        self.builder.buildNumber(number: 10)
        self.builder.buildName(name: "なまえ")
        self.builder.buildFlag(flag: true)
    }
}

Builder.swift

// 各プロパティを設定するメソッドを持つ
class Builder: NSObject {
    func buildNumber(number: Int) {}
    func buildName(name: String) {}
    func buildFlag(flag: Bool) {}
}

ConcreteBuilder.swift

// Product オブジェクトを構築するクラス
class ConcreteBuilder: Builder {
    
    let product = Product()
    
    override func buildNumber(number: Int) {
        self.product.number = number
    }
    
    override func buildName(name: String) {
        self.product.name = name
    }
    
    override func buildFlag(flag: Bool) {
        self.product.flag = flag
    }
    
    func getResult() -> Product {
        return self.product
    }
}

Product.swift

// プロパティを表示するメソッドを持つ
class Product: NSObject {
    
    var number: Int?
    var name: String?
    var flag: Bool?
    
    func printProperty() {
        print("number: \(self.number)")
        print("name: \(self.name)")
        print("flag: \(self.flag)")
    }
}

ViewController.swift

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let concreteBuilder = ConcreteBuilder()

        // Director が concreteBuilder で Product(生成物) インスタンスを生成
        let director = Director(builder: concreteBuilder)
        director.construct()
        
        let obj = concreteBuilder.getResult()
        obj.printProperty()
    }
}

実行結果

number: Optional(10)
name: Optional("なまえ")
flag: Optional(true)

まとめ

Director は ConcreteBuilder をすることで、Product が生成されていることが確認できます。

次回は 生成パターンFactory Method パターンを説明したいと思います。

この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。

siro:chro 無料ゲーム SQN をリリースしました

img_sqn_00

sirochro 初の無料ゲームアプリ SQN をリリースしました。
記事:SQN: iOS 無料ゲームアプリ SQN - Sequential Numbers をリリース
ちょっとした時間に楽しめる完全無料のゲームなっていますので、是非ダウンロードして遊んでみてください。

↓SQN のダウンロードはこちらから

Related Contents

Pickup Contents