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)