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

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(工場)のように、注文に応じた製品(オブジェクト)を生産する仕組みだよ
← 用語集にもどる