PHPで学ぶデザインパターン - Factory・Factory Method・Abstract Factory

この記事はPHPで学ぶデザインパターン Advent Calendar 2018の記事です。

概要

Factory・Factory Method・Abstract Factoryについてかきます。

Factoryパターンについて知る

まずはFactoryパターンについてざっくり説明します。

その名の通り、工場(Factory)はオブジェクトの”生成”を担います。 オブジェクトの生成と利用を分離することで、利用側はオブジェクトの生成順や種類を知らなくてもオブジェクトを生成することができます。 オブジェクトの生成場所を1箇所にまとめることができるので、生成順や種類等の変更が容易になります。

Factory Methodパターンについて知る

上述のFactoryパターンでは、生成したいオブジェクトのクラスが増えると条件分岐が増えてしまい、辛い未来が見えてきそうです。 そこで、オブジェクトのクラスを指定することなく、オブジェクトを生成するようにしようというのがFactory Methodパターンです。

Factoryを抽象化して、オブジェクトの生成処理をサブクラスに任せることで、条件分岐をなくすことができます。

生成するオブジェクトを変更する場合はFactoryの切り替えを行う形になります。

FactoyパターンのときのコードをFactory Methodパターンを適用した形に変更してみました。

引数によって生成されるオブジェクトを切り替えていた部分が大きく変わりました。

FactoryパターンとFactory Methodパターンはオブジェクトの生成パターンが異なるものですが、両者を混同している記事がいくつか見受けられて厄介だなーと思いました。

Abstract Factoryパターンについて知る

Abstract Factoryパターンは、複数のFactoryを共通のテーマによってグループ化するようなパターンです。

Abstract FactoryはFactory Methodの発展した感じという印象です。

Factoryのインターフェースを定義しているという点で、より上位概念からの解釈ができると思うのですが、今回はニュアンスを掴むまでに留めておきます。

所感

それぞれのパターンのニュアンスの違いがわかったような気がします。 もう少しオブジェクト指向の真髄を知っていたらより深い解釈ができそうです。

参考