Abstract Factory パターンとは

デザインパターンの1つで、関連するオブジェクトの生成を行うクラスを抽象的にして、生成を行うためのインターフェースを提供する。

インスタンスを生成するためのAPIを集約することにより、情報隠蔽や複数のモジュールの再利用を効率よく行うことが可能になる。



実装例

AbstractFactoryPattern.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import UIKit



/// Abstract Factory パターン ----------------------------------------

/// Productクラス(製品)
protocol Doll {
    func sayHallo()
}

/// Creatorクラス(工場)
protocol Factory {
    func createInstance() -> Doll
}

/// ConcreteProductクラス(Japanese製品)
class JapaneseDoll: Doll {
    func sayHallo() {
        print("こんにちは")
    }
}

/// ConcreteProductクラス(America製品)
class AmericanDoll: Doll {
    func sayHallo() {
        print("Hallo")
    }
}

/// ConcreteCreatorクラス(Chinese製品)
class ChineseDoll: Doll {
    func sayHallo() {
        print("你好")
    }
}

/// Abstract Factory(XXのConcreteCreatorクラス(XX製品を作るXX工場)を作るFactoryメソッド)
enum Country {
    case Japan
    case America
    case China
}

enum DollFactory {
    static func create(from country: Country) -> Doll {
        switch country {
        case .Japan:
            return JapaneseDoll()
        case .America:
            return AmericanDoll()
        case .China:
            return ChineseDoll()
        }
    }
}



/// 呼び出す ------------------------------------------------------------

class ViewController: UIViewController {
    
    var doll: Doll { return DollFactory.create(from: .Japan) }  // 例えば .Japan を .America に変えるだけでAmericanDollのインスタンスが生成できる
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        doll.sayHallo()
    }
}


Abstract FactoryでDollオブジェクトをインスタンス化する役割を持つ。
そのため、呼び出し側で生成されるインスタンスのことを意識しなくて済む(状況が変わっても修正箇所は微量且つ呼び出す側のコードに影響がない)