Factory Method

デザインパターンとは

デザインパターンとはオブジェクト思考開発における先人たちが作り上げてきた便利な設計図です。

Gang of Four通称Gofが1994年に出版した『オブジェクト指向における再利用のためのデザインパターン』の中で23個の設計図が紹介されています。

Note

デザインパターンのサンプルコードはSwift4でまとめます。

ファクトリーメソッドパターンとは?

工場と言う意味であり、オブジェクトの生成と使用する場所を分離させるパターンです。

開発者は工場に生成を依頼するだけでオブジェクトを取得することができます。生成手順や種類などの処理は工場クラスの中で行います。

テンプレートメソッドパターンと併用して使われることが多いです。

サンプルコード

サンプルとして、イベント参加者にネームプレートを作成し、参加者一覧を保存しておくと言うものを考えました。

参加者とファクトリーのプロトコル

protocol Participant {
    var name:String { get }
}
protocol Factory {
    func create(name: String) -> NamePlate
    func createNameplate(name: String) -> NamePlate
    func register(plate: String)
}

ファクトリークラス

参加者のインスタンスを作る際はcreateメソッドに名前を入れることで、ネームプレートの作成と、参加者一覧の名前を保持しておくことができます。

名前以外の要素を組み込みたいときはNamePlateFactoryのサブクラスを作成しcreateNameplateメソッドをoverrideして作成するネームプレートの内容を変更します。

class  NamePlateFactory: Factory {
    var participantList: [String] = []
    
    func create(name: String) -> NamePlate {
        let nameplate = createNameplate(name: name)
        register(plate: name)
        return nameplate
    }
    
    func createNameplate(name: String) -> NamePlate {
        let nameplate = NamePlate(name: name)
        return nameplate
    }
    
    func register(plate: String) {
        participantList.append(plate)
    }
}

参加者クラス

名前だけのシンプルなクラス。

class NamePlate: Participant {
    
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

ソースコード一覧

import UIKit

protocol Participant {
    var name:String { get }
}
protocol Factory {
    func create(name: String) -> NamePlate
    func createNameplate(name: String) -> NamePlate
    func register(plate: String)
    
}
class  NamePlateFactory: Factory {
    var participantList: [String] = []
    
    func create(name: String) -> NamePlate {
        let nameplate = createNameplate(name: name)
        register(plate: name)
        return nameplate
    }
    
    func createNameplate(name: String) -> NamePlate {
        let nameplate = NamePlate(name: name)
        return nameplate
    }
    
    func register(plate: String) {
        participantList.append(plate)
    }
}

class NamePlate: Participant {
    
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

let factory = NamePlateFactory()
let nameplate1 = factory.create(name: "はるみ")
print(nameplate1.name)

let nameplate2 = factory.create(name: "まさき")
print(nameplate2.name)

参考文献

デザインパターン「Factory Method」

FactoryMethod パターン

Swiftで学ぶデザインパターン3 (FactoryMethod パターン)

デザインパターン

前の記事

Abstract Factory
デザインパターン

次の記事

Builder