オブジェクト設計において、定石となる手法をパターン化したものを デザインパターン といいます。
デザインパターンをきちんと勉強していない人でも、Web のおかげで知らず知らずのうちに使って(コピペして)その恩恵を享受しています。
自分自身パターン概要を一読しただけで、あいまいな使い方をしているものが多く、この際勉強を兼ねて GOF 23 パターンのなかでよく利用するものを Swift3 で記述していきたいと思います。
今回は 生成パターン の Builder について説明します。
目次
- [生成] Builder パターン
- まとめ
[生成] Builder パターン
Builder はオブジェクトの生成(建築)過程を抽象化し、動的にオブジェクトを生成(建築)することを可能にするパターンです。
パターンの概要
- Director
- Builder に提供されているインタフェースを使用しオブジェクトを生成(建築)する。
- Builder
- オブジェクト生成(建築)過程のインターフェースを定義する。
- ConcreteBuilder
- Builder が定義したインターフェースを実装する。
- Product
- Builder により生成されたオブジェクト(成果物)。
サンプルコード
Director.swift
[code]
// 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)
}
}
[/code]
Builder.swift
[code]
// 各プロパティを設定するメソッドを持つ
class Builder: NSObject {
func buildNumber(number: Int) {}
func buildName(name: String) {}
func buildFlag(flag: Bool) {}
}
[/code]
ConcreteBuilder.swift
[code]
// 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
}
}
[/code]
Product.swift
[code]
// プロパティを表示するメソッドを持つ
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)”)
}
}
[/code]
ViewController.swift
[code]
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()
}
}
[/code]
実行結果
[code]
number: Optional(10)
name: Optional(“なまえ”)
flag: Optional(true)
[/code]
まとめ
Director は ConcreteBuilder をすることで、Product が生成されていることが確認できます。
次回は 生成パターン の Factory Method パターンを説明したいと思います。
この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。