はじめに
ファクトリーパターン(Factory Pattern)は、Javaのデザインパターンの中で頻繁に使用される オブジェクト生成に関するパターン です。
「どのクラスのインスタンスを生成するか」を柔軟に管理し、コードをシンプルかつ保守しやすくすることが目的です。
この記事では、ファクトリーパターンの基本概念、シンプルな実装方法、実用的なサンプルコード を初心者でも理解できるように解説します。
1. ファクトリーパターンとは?
ファクトリーパターンは、オブジェクトを直接 new で生成する代わりに、専用の工場(Factory)メソッド でインスタンスを生成する方法です。
なぜファクトリーパターンが必要か?
- 柔軟なインスタンス生成: 生成するオブジェクトの種類を動的に切り替えられる。
- コードの依存性を減らす: 具体的なクラス名を直接書かないため、保守性が向上する。
- DRY原則: オブジェクト生成の処理を1箇所にまとめることで、コードの重複を防ぐ。
2. ファクトリーパターンの構成
ファクトリーパターンは以下の3つの要素で構成されます:
- 抽象クラス/インターフェース
- 具体クラス
- ファクトリクラス
3. 基本的なファクトリーパターンの実装
3.1 サンプル: 動物のオブジェクトを生成する工場
「Dog」や「Cat」のオブジェクトを作成する例を使って、ファクトリーパターンを実装します。
ステップ1: 抽象クラス/インターフェースの定義
// 抽象クラスまたはインターフェース
interface Animal {
void sound(); // 共通のメソッド
}
ステップ2: 具体クラスの実装
// 具体クラス: 犬
class Dog implements Animal {
@Override
public void sound() {
System.out.println("ワンワン");
}
}
// 具体クラス: 猫
class Cat implements Animal {
@Override
public void sound() {
System.out.println("ニャーニャー");
}
}
ステップ3: ファクトリクラスを作成
// ファクトリクラス
class AnimalFactory {
public static Animal createAnimal(String type) {
if ("dog".equalsIgnoreCase(type)) {
return new Dog();
} else if ("cat".equalsIgnoreCase(type)) {
return new Cat();
} else {
throw new IllegalArgumentException("不明な動物タイプ: " + type);
}
}
}
ステップ4: ファクトリを使ってオブジェクトを生成
public class Main {
public static void main(String[] args) {
// 犬のインスタンスを生成
Animal dog = AnimalFactory.createAnimal("dog");
dog.sound(); // 出力: ワンワン
// 猫のインスタンスを生成
Animal cat = AnimalFactory.createAnimal("cat");
cat.sound(); // 出力: ニャーニャー
}
}
3.2 コードの流れ
- 抽象クラス/インターフェース:
Animalで共通のメソッドを定義。 - 具体クラス:
DogとCatがそれぞれAnimalを実装。 - ファクトリクラス:
AnimalFactoryがAnimalの具体的なオブジェクトを生成。 - 呼び出し側: ファクトリを使って動物のオブジェクトを生成し、共通のメソッドを呼び出す。
4. ファクトリパターンの応用例
4.1 システム設定やデータベース接続
ファクトリパターンは、設定ファイルや条件に応じて異なるデータベース接続クラスを生成する場合に利用できます。
サンプル: データベース接続クラス
// 抽象クラス/インターフェース
interface Database {
void connect();
}
// 具体クラス: MySQL
class MySQL implements Database {
@Override
public void connect() {
System.out.println("MySQLに接続しました。");
}
}
// 具体クラス: Oracle
class Oracle implements Database {
@Override
public void connect() {
System.out.println("Oracleに接続しました。");
}
}
// ファクトリクラス
class DatabaseFactory {
public static Database getDatabase(String dbType) {
if ("mysql".equalsIgnoreCase(dbType)) {
return new MySQL();
} else if ("oracle".equalsIgnoreCase(dbType)) {
return new Oracle();
}
throw new IllegalArgumentException("不明なデータベースタイプ: " + dbType);
}
}
// 使用例
public class Main {
public static void main(String[] args) {
Database db = DatabaseFactory.getDatabase("mysql");
db.connect(); // 出力: MySQLに接続しました。
Database db2 = DatabaseFactory.getDatabase("oracle");
db2.connect(); // 出力: Oracleに接続しました。
}
}
5. ファクトリパターンのメリットとデメリット
メリット
- 柔軟性: どのクラスのオブジェクトを生成するかを外部から変更可能。
- コードの依存性低減: 具体クラスを直接呼び出さず、インターフェースや抽象クラスを使うため変更に強い。
- 保守性向上: オブジェクト生成処理を1箇所にまとめることで修正が容易。
デメリット
- コードが増える: 小さなシステムでは不要に感じることもある。
- 複雑性: ファクトリが増えすぎると管理が難しくなる。
6. まとめ
ファクトリパターンは、オブジェクト生成を柔軟に管理するための強力な設計パターンです。
- 基本構成: 抽象クラス/インターフェース、具体クラス、ファクトリクラス。
- 使い方: クラスのインスタンス生成を
Factoryに任せることで、コードの柔軟性と保守性を向上させる。 - 実用例: 動物オブジェクト生成、データベース接続設定など。
初心者の方はシンプルな例から始めて、少しずつ実践の中で使い方をマスターしていきましょう。
次のステップ
デザインパターンをさらに深く学びたい方は、絶対にJavaプログラマーになりたい人へ で学習を進め、実務スキルを向上させましょう!また、転職サポートも受けたい方は サイゼントアカデミー が最適です。


コメント