Factory Methodパターン(オブジェクトの生成処理を分離するデザインパターン)をクラス図にまとめる

デザインパターン

Factory Methodパターン

Factory Methodパターンは、オブジェクトの生成処理を分離するデザインパターンです。
自分なりにFactory Methodパターンをクラス図にまとめてみました。

Factory Methodパターンのクラス図

FactoryMethodパターンのクラス図

FactoryMethodパターンのクラス図

Factory Methodパターンの解説

あるクラス(今回はProduct)を継承するサブクラスが複数あり(Product1,Product2)、そのクラスのメソッド(今回はfunc)を呼び出す際に、呼び出し側がどのサブクラスを生成するかを意識しなくて済むように、Productオブジェクトの生成を担うクラス(Factory)を作る。

クラス図ではFactoryを継承する具象クラスFactory1,2クラスを定義しているが、
実際に実装する際は、FactoryクラスがProduct1,2どちらを生成するかを判定してFactory1,2を分けない書き方をすることもある。
。ただProduct1,2の生成処理が冗長になる場合は、Factory1,2を作成して処理を分離させた方が分かりやすい。

クラスの関連としてはStrategyクラスにも似ている。
StrategyパターンにおけるContextクラスがFactory、StrategyがProductという対応である。
ただFactory MethodパターンはあくまでFactoryは生成を担うもの、としているので、Strategyとは着眼点が違う。

Factory Methodパターンをどういう場合に使うか

Strategyと同じように、ファイルの形式によって処理を変えたい時、などに使える。
Strategyパターンで分岐処理が肥大化してきたら、Factoryパターンを用いるとStrategyパターンの分岐処理部分が分離できるので、メインの処理がシンプルにできる。

PlantUMLでFactory Methodパターンのクラス図を記述する

文頭のFactory Methodパターンのクラス図をPlantUMLで書いたときのソースです。

@startuml Factory Method
class Product{
  + func()
}
class Product1 extends Product{
  + func()
}
class Product2 extends Product{
  + func()
}
abstract class Factory{
  + {abstract} create(arg): Product
}
class Factory1 extends Factory{
  + create(arg): Product
}
class Factory2 extends Factory{
  + create(arg): Product
}
Factory1 -l-> Product1 : create > 
Factory2 -l-> Product2 : create > 
Factory -l-> Product : create > 
@enduml

参考サイトURL

PHPによるデザインパターン入門 – Factory Method〜生成処理と使用処理を分離する
Factory Method パターン