はじめに:Factoryパターンは「正しい設計への入り口」
Javaで開発をしていると、同じインタフェースを持つ複数のクラスを使い分ける場面が必ず出てきます。
例えば、
- Circle / Rectangle / Triangle のような図形
- MySQL / PostgreSQL のようなDBクライアント
- ローカル / クラウドに保存するストレージ
- CSV / JSON / XML のパーサ
こういった種類の異なるオブジェクトたちを「どこで生成するか?」は、システム設計では非常に重要です。
たとえば次のようなコードは、最初はシンプルに見えてもすぐに限界がきます。
|
1 2 3 4 5 6 7 8 |
if (type.equals("circle")) { return new Circle(); } else if (type.equals("rectangle")) { return new Rectangle(); } else if (type.equals("triangle")) { return new Triangle(); } |
- 分岐が増える
- クライアントが実装クラスに依存する
- 拡張したいとき修正箇所が増える
- テストしづらい
そこで登場するのが Factoryパターン(工場パターン) です。
この記事では、Factoryパターンを
「初心者でも分かる言葉で、実務経験者が読んでも満足できるレベルまで」
徹底的に分かりやすく解説します。
Factoryパターンとは?(小学生にも分かる説明)
Factoryパターンは、一言でいえば:
「オブジェクトを作る場所(工場)をひとつにまとめる設計方法」
です。
普通はこうします。
|
1 2 |
使う側 → new Circle() |
Factoryパターンではこう変わります。
|
1 2 |
使う側 → CircleFactory.create() |
使う側は Circle という実装を知らなくてよい のが重要なポイントです。
🍱 お弁当の例で説明すると…
- ご飯、肉、野菜、デザート…
- 入れるのは工場(Factory)
- 食べる側(クライアント)は「から揚げ弁当つくって!」と言うだけ
中身(何を new しているか)を知らなくても良い。
この「仕組みの分離」が大規模アプリの保守性を劇的に上げます。
Factoryパターンが解決する問題
Factoryは何のためにあるのでしょうか?
1:new の乱立を防ぐ
多くの場所で new を使うと、クラスが実装に強く依存してしまいます。
2:変更に弱いコードになるのを防ぐ
「クラスを追加」「振る舞いを変更」したいとき、あちこちの new を直す羽目になります。
Factoryを使えば 生成部分を1か所に集約 できます。
3:クライアントコードが条件分岐だらけになる問題を解決
Factory内部で分岐すれば十分。
クライアントが if 文だらけになるのを防げます。
4:テストしやすいコードにする
Factoryを使えば、テスト時にモックを用意することが簡単になります。
5:OCP(オープン・クローズド原則)に合う
「拡張には開いている」「変更には閉じている」
Factoryはこれを実現する重要な要素です。
Javaでの最も典型的なFactoryパターン(Simple Factory)
業務システムで最もよく使われるのは Simple Factory です。
もっともシンプルに、クラス生成だけを担当します。
◆ Interface と実装クラスを用意
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public interface Shape { void draw(); } public class Circle implements Shape { @Override public void draw() { System.out.println("Circle"); } } public class Rectangle implements Shape { @Override public void draw() { System.out.println("Rectangle"); } } |
◆ Factory クラスの実装
|
1 2 3 4 5 6 7 8 9 10 |
public class ShapeFactory { public static Shape create(String type) { return switch (type.toLowerCase()) { case "circle" -> new Circle(); case "rectangle" -> new Rectangle(); default -> throw new IllegalArgumentException("Unknown type: " + type); }; } } |
◆ 使う側のコード(依存がとても弱い!)
|
1 2 3 |
Shape shape = ShapeFactory.create("circle"); shape.draw(); |
クライアント側は new Circle() を直接知らなくてもOK。
Factory Methodパターン(レベルアップ版)
次は「Factory Method パターン」。
Javaの本格的な設計でよく登場します。
◆ 構造
- 抽象クラス(またはインタフェース)に factory method を定義
- サブクラスで「何を生成するか」を決める
例:UIダイアログのパターン(Windows / Mac)
|
1 2 3 4 5 6 7 8 9 |
public abstract class Dialog { public void render() { Button btn = createButton(); btn.onClick(); } protected abstract Button createButton(); } |
サブクラスで生成を切り替え:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class WindowsDialog extends Dialog { @Override protected Button createButton() { return new WindowsButton(); } } public class MacDialog extends Dialog { @Override protected Button createButton() { return new MacButton(); } } |
「どのボタンか」はサブクラスが決定し、
「使い方」は共通のまま。
非常に柔軟です。
Simple Factory と Factory Method の違い(表で比較)
| 項目 | Simple Factory | Factory Method |
|---|---|---|
| クラス数 | 少ない | 増えるが柔軟 |
| 生成ロジック | Factoryに集約 | サブクラスごとに生成 |
| 拡張性 | 普通 | 高い |
| 実務利用 | 非常に多い | 中規模以上でよく使う |
| 学習難易度 | 低い | 中 |
さらに進化した Abstract Factory
Abstract Factory は「関連する複数のオブジェクト」をまとめて生成したいときに使います。
- ボタン
- メニュー
- テキストボックス
など、UIをまとめて OS ごとに切り替えるときに便利。
Factoryパターンのメリットまとめ
1:依存を減らせる
クライアントが実装クラスに依存しない。
2:変更に強いコードになる
クラス追加時、Factory側だけ変更すれば良い。
3:テストがしやすくなる
インタフェースだけ知っていればモックで差し替えOK。
4:可読性と保守性が上がる
new が散らばると地獄。
Factoryがまとめてくれる。
Factoryパターンのデメリット
- クラス数が増える
- 小規模では過剰設計になる
- 使いどころを誤ると複雑になる
ただし、中規模以上のシステムではほぼ標準的に使われます。
実務でのFactoryパターンのよくある使いどころ
- ログ出力クラスの切り替え
- DB接続クライアントの切り替え
- ファイル形式(CSV / JSON / XML)の切り替え
- APIクライアントの切り替え
- 認証方式の切り替え
- ストレージの切り替え(ローカル / S3 など)
どれも “実装が複数あるもの” に強いパターンです。
Java と Factoryパターンの相性が良い理由
Javaは以下の理由でFactoryとの相性が抜群です。
- インタフェースを中心とした設計がしやすい
- 抽象化と多態性(ポリモーフィズム)が自然
- IDEの補完が強力で読みやすい
- 大規模開発とマッチする
特にJavaは現場での保守性が何より重要。
Factoryパターンはその要求に完全に合うパターンです。
Javaエンジニアを目指す人は Factory を必ず理解すべき
Factoryはオブジェクト指向の基礎であり、
エンジニアとして成長するための必須スキルです。
Javaプログラマーとして差がつくポイントでもあります。
本気でJavaを学ぶなら、まずはこれを読むべき
Java学習の最初の一歩として最適な本があります。
初心者でも理解しやすく、FactoryやOOPの基礎力がしっかり身につきます。
さらに成長したい人へ(ソースレビュー・転職サポートつき)
- コードレビューを受けたい
- 実務レベルのJavaを短期間で習得したい
- Javaエンジニアに転職したい
そんな人は サイゼントアカデミー を強くおすすめします。
Java学習・実務コードレビュー・転職サポートまで揃っているので、
成果が圧倒的に早く出ます。
まとめ
- Factoryパターンは「オブジェクト生成」を分離し、コードを柔軟にする
- Simple Factory、Factory Method、Abstract Factory を理解すれば実務で困らない
- JavaはFactoryパターンとの相性が非常に良い
- 設計力の基礎として必ず習得すべきテクニック
ぜひ自分の開発プロジェクトでも取り入れてみてください!


コメント