(図: wikipedia)
特徴
- **「生成」**に関するパターン
- Factory Methodはクラスのイニシャライザの代わりに使用する。
オブジェクト生成のプロセスを抽象化し、実行時にインスタンス化したオブジェクトの型を生成する。 - ファクトリーは「工場」、インスタンスを生成する工場がFactory Methodパターン。
- 単体のみ生成のケースだとTemplate Methodパターンになる。
- Javaでいうと抽象クラスにあたる。
ソースコード
example
// 通貨の説明
protocol CurrencyDescribing {
var symbol: String { get }
var code: String { get }
}
final class Euro: CurrencyDescribing {
var symbol: String {
return "€"
}
var code: String {
return "EUR"
}
}
final class UnitedStatesDolar: CurrencyDescribing {
var symbol: String {
return "$"
}
var code: String {
return "USD"
}
}
enum Country {
case unitedStates
case spain
case uk
case greece
}
struct CurrencyFactory {
static func currency(for country: Country) -> CurrencyDescribing? {
switch country {
case .spain, .greece:
return Euro()
case .unitedStates:
return UnitedStatesDolar()
default:
return nil
}
}
}
usage
import UIKit
class ViewController: UIViewController {
let noCurrencyCode = "No Currency Code Available"
override func viewDidLoad() {
super.viewDidLoad()
let greece = CurrencyFactory.currency(for: .greece)?.code ?? noCurrencyCode // "EUR"
let spain = CurrencyFactory.currency(for: .spain)?.code ?? noCurrencyCode "EUR"
let unitedStates = CurrencyFactory.currency(for: .unitedStates)?.code ?? noCurrencyCode // "USD"
let uk = CurrencyFactory.currency(for: .uk)?.code ?? noCurrencyCode // "No Currency Code Available"
}
}
関連パターン
- Template Method
- Factory MethodパターンはTemplate Methodパターンの応用。
- Singleton
- CurrencyFactoryを務める構造体は、Singletonパターンとしても作ることができる。
- インスタンスが複数存在する必要がないため。
- Composite
- CurrencyDescribingを務めるprotocolにCompositeが当てはまる場合がある。
- Iterator
- Iteratorのインスタンスを作成する際に、Factory Methodパターンが使われる場合がある。
まとめ
- 1つのクラスを見るだけでは、どのパターンかを判断することができない。
- クラスやプロトコルの相互関係を目を向けて見定める。