【ふぁくとりーぱたーん】

Factoryパターン とは?

💡 オブジェクトの「生成工場」を作って分離する
📌 このページのポイント
Factory パターン(生成の委譲) Client 利用する側 create() Factory 生成ロジックを カプセル化 type で分岐 Product A 例: PDFExporter Product B 例: CSVExporter Product C 例: ExcelExporter ※ Clientは具体的な クラスを知らない 生成処理をFactoryに委譲し、Clientと具体クラスの結合を減らす
Factoryパターンのイメージ
ひよこ ひよこ

なぜnewで直接作らないの?

ペンギン先生 ペンギン先生

new ConcreteClass()をコード中に散らばらせると、クラスを変更したい時に全箇所を修正する必要がある。Factoryに集約すれば変更箇所は1箇所。テスト時にモックオブジェクトに差し替えるのも簡単。「オブジェクトの生成は思ったより変更が多い」というのがFactoryパターンの動機だよ

ひよこ ひよこ

Factory MethodとAbstract Factoryの違いは?

ペンギン先生 ペンギン先生

Factory Methodは「1つのメソッドオブジェクトを作る」。createButton()がOSに応じてWindowsButtonやMacButtonを返す。Abstract Factoryは「関連するオブジェクトのセットを作る」。GUIFactory.createButton()とcreateCheckbox()がまとめてOS用の部品セットを返す。単品ならFactory Method、セットならAbstract Factoryだよ

ひよこ ひよこ

実際のコードで使う場面は?

ペンギン先生 ペンギン先生

データベース接続(環境に応じてMySQLPostgreSQLSQLiteを切り替え)、②ロガー(本番はCloudWatch、開発はConsole)、③通知サービス(メール、Slack、SMS を設定で切り替え)、④テスト(本番はHTTPクライアント、テスト時はモック)。DIコンテナ(Spring、NestJS)は内部的にFactoryパターンを大量に使っているよ

ひよこ ひよこ

使いすぎの問題は?

ペンギン先生 ペンギン先生

「生成ロジックが単純なのにFactoryを作る」のは過剰設計。将来の拡張に備えてFactoryを作ったけど結局1種類しか使わなかった、というケース。YAGNIの原則に従って、実際に切り替えの必要が出てから導入しても遅くない。Simple Factoryから始めて必要に応じてFactory Methodに進化させるのがおすすめだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Factoryパターン」って出てきたら「オブジェクトの生成を専用の仕組みに任せるパターン」と思えればだいたいOK!
📖 おまけ:英語の意味
「Factory Pattern」 = 工場パターン
💬 Factory(工場)のように、注文に応じた製品(オブジェクト)を生産する仕組みだよ
← 用語集にもどる