MENU
コンテンツ再構築中

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

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

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

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

INDEX

目次

  • 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で共有していただければ幸いです。

Please share it!
  • URLをコピーしました!
  • URLをコピーしました!
INDEX