6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Swiftで学ぶFactory Methodパターン【Swift Design Pattern】

Posted at

500px-Factory_Method_UML_class_diagram.svg.png
(図: 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つのクラスを見るだけでは、どのパターンかを判断することができない。
    • クラスやプロトコルの相互関係を目を向けて見定める。

参考

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?