オブジェクト設計において、定石となる手法をパターン化したものを デザインパターン といいます。
デザインパターンをきちんと勉強していない人でも、Web のおかげで知らず知らずのうちに使って(コピペして)その恩恵を享受しています。
自分自身パターン概要を一読しただけで、あいまいな使い方をしているものが多く、この際勉強を兼ねて GOF 23 パターンのなかでよく利用するものを Swift3 で記述していきたいと思います。
今回は 生成パターン の Factory Method について説明します。
目次
- Factory の概要
- [生成] Factory Method パターン
- まとめ
Factory の概要
オブジェクトの 生成 と、オブジェクトの 実装 を 分離する するパターン。
プロダクトを発注する側は、工場内でどういった工程を経てプロダクトが完成するかを知らなくても、工場に対しプロダクトを要求すれば、プロダクトを受け取る事ができる。
この仕組みにより、プロダクト発注側はプロダクトの管理 に、工場側はプロダクトの生産工程 に集中できるようになる。
[生成] Factory Method パターン
オブジェクトの生成のインタフェースを提供し、インスタンス化するクラスを決定するのはサブクラスで行う。
Factory の原則と Abstract Factory パターンとの違い
- Factory の原則
- オブジェクトを生成するとき、オブジェクトの生成のためのインタフェースを提供し、インスタンス化するクラスを決定する役割はサブクラスで行う。
- Factory Method パターン
- オブジェクトを生成するとき、オブジェクトの生成のためのインタフェースを提供し、インスタンス化するクラスを決定する役割はサブクラスで行う。
- Abstract Factory パターン
- オブジェクトを生成するとき、具体的なクラスを明確にせず(カプセル化)、生成のためのインタフェースを提供する。
パターンの概要
- Product
- 生成オブジェクト ConcreteProduct のインタフェースを決定
- ConcreteProduct
- 具体的な製品を決定します。
サンプルコード
Product.swift
[code]
class Product: AbstractProduct {
private init() {}
static func create() -> AbstractProduct {
return Product()
}
}
[/code]
ConcreteProduct.swift
[code]
class ConcreteProduct: AbstractProduct {
private init() {}
static func create() -> AbstractProduct {
return ConcreteProduct()
}
}
[/code]
ViewController.swift
[code]
protocol AbstractProduct {
static func create() -> AbstractProduct
func doStuff()
}
extension AbstractProduct {
func doStuff() {
let className = String(describing: self)
print(“\(className).doStuff()”)
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let concrete = ConcreteProduct.create()
let product = Product.create()
concrete.doStuff()
product.doStuff()
}
}
[/code]
実行結果
[code]
XXX.ConcreteProduct.doStuff()
XXX.FMProduct.doStuff()
[/code]
※ XXX はプロジェクト名
まとめ
今回は ViewController の Protocol と Extension を利用して抽象クラスを実現していますが、次期 Swift では抽象クラスにも対応するみたいです。
次回は 生成パターン の Abstract Factory パターンを説明したいと思います。
この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。