MENU
コンテンツ再構築中

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

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

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

前回は Factory Method パターンを説明しましたが、もう一つの Factory パターンである 生成パターンAbstract Factory について説明します。

INDEX

目次

  • Factory について
  • [生成] Abstract Factory パターン
  • まとめ

Factory の概要

オブジェクトの 生成 と、オブジェクトの 実装分離する するパターン。

プロダクトを発注する側は、工場内でどういった工程を経てプロダクトが完成するかを知らなくても、工場に対しプロダクトを要求すれば、プロダクトを受け取る事ができる。

この仕組みにより、プロダクト発注側はプロダクトの管理 に、工場側はプロダクトの生産工程 に集中できるようになる。

[生成] Abstract Factory パターン

複数の関連オブジェクトを、各具象クラス(ConcreteProduct)を明確にせず、オブジェクト生成の インタフェースのみを提供する。

Factory の原則と Factory Method パターンとの違い

Factory の原則
オブジェクトを生成するとき、オブジェクトの生成のためのインタフェースを提供し、インスタンス化するクラスを決定する役割はサブクラスで行う。
Factory Method パターン
オブジェクトを生成するとき、オブジェクトの生成のためのインタフェースを提供し、インスタンス化するクラスを決定する役割はサブクラスで行う。
Abstract Factory パターン
オブジェクトを生成するとき、具体的なクラスを明確にせず(カプセル化)、生成のためのインタフェースを提供する。

パターンの概要

Product
Protocol により抽象的に生成オブジェクト ConcreteProduct のインタフェースを決定する。
ConcreteProductA, B
具体的な Product を決定する。

サンプルコード

ConcreteProductA.swift

[code]
class ConcreteProductA: Product {
func call() {
print(“This is ProductA”)
}
}
[/code]

ConcreteProductB.swift

[code]
class ConcreteProductB: Product {
func call() {
print(“This is ProductB”)
}
}
[/code]

ViewController.swift

[code]
enum Type {
case A
case B
}
protocol Product {
func call()
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()

create(type: .A).call()
create(type: .B).call()
}
func create(type: Type) -> Product {
switch type {
case .A: return AFConcreteProductA()
case .B: return AFConcreteProductB()
}
}
}
[/code]

実行結果

[code]
This is ProductA
This is ProductB
[/code]

まとめ

Abstract Factory パターンにより、具象オブジェクトの実装を気にすることなく、オブジェクトの生成と生成したオブジェクトの利用に専念できるようになり、コードのメンテナンス性が向上しました。

次回は 構造パターンAdapter パターンを説明したいと思います。

この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。

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