ファクトリーファミリー
作成日時:2026-03-15
更新日時:2026-03-15
factoryパターン関連をLLMに質問した際のメモ。
シンプルファクトリー(Simple Factory)
// これはシンプルファクトリー
static DataWriter of(FileType type) {
return switch (type) {
case CSV -> new CsvWriter();
case XLSX -> new XlsxWriter();
case HTML -> new HtmlWriter();
};
}パターンの違い
1. シンプルファクトリー
- 1つのメソッドで全ての生成ロジックを集中管理
switchやifで分岐してインスタンスを返す- GoFの23パターンには含まれない
2. ファクトリーメソッドパターン(Factory Method Pattern)
- 継承を使って生成するオブジェクトを決定
- サブクラスがどのクラスをインスタンス化するか決める
// ファクトリーメソッドパターンの例
abstract class DataExporter {
// ファクトリーメソッド(サブクラスでオーバーライド)
protected abstract DataWriter createWriter();
public void export(Data data) {
var writer = createWriter();
writer.write(data);
}
}
class CsvExporter extends DataExporter {
@Override
protected DataWriter createWriter() {
return new CsvWriter();
}
}
class XlsxExporter extends DataExporter {
@Override
protected DataWriter createWriter() {
return new XlsxWriter();
}
}
// 使用例
DataExporter exporter = new CsvExporter();
exporter.export(data);3. 抽象ファクトリーパターン(Abstract Factory Pattern)
- 関連するオブジェクト群を生成
- ファクトリー自体が抽象化されている
interface DataExportFactory {
DataWriter createWriter();
DataFormatter createFormatter();
DataValidator createValidator();
}
class CsvExportFactory implements DataExportFactory {
public DataWriter createWriter() { return new CsvWriter(); }
public DataFormatter createFormatter() { return new CsvFormatter(); }
public DataValidator createValidator() { return new CsvValidator(); }
}どのパターンを使うべきか
シンプルファクトリー(元のコード)が適切な場合
- ✅ 生成ロジックが単純
- ✅ 種類が事前に決まっている
- ✅ コードをシンプルに保ちたい
- ⚠️ 新しい型を追加するたびにファクトリーを修正(OCP違反)
ファクトリーメソッドパターンが適切な場合
- ✅ サブクラスで生成するオブジェクトを変えたい
- ✅ フレームワークやライブラリを作る
- ✅ 拡張性を重視する
- ⚠️ クラス階層が複雑になる
訂正版の説明
元のドキュメントで「ファクトリーメソッド」という用語を使うなら、こう訂正すべきです:
goodPatternはメソッドは短いし、サポートするファイル形式が増えても長くならない。
FileType列挙型とそのファイル形式を出力するDataWriterを実装するだけでいい。
生成ロジックは**シンプルファクトリー(静的ファクトリーメソッド)** 内にのみ存在し、
インスタンスを生成するだけなので長くもならない。または、パターン名を明示せずに:
生成ロジックはファクトリー内に集約され、インスタンスを生成するだけなので
長くもならない。俺は継承が嫌い。
変更に弱いから。
Simple Factoryパターンの実装
staticを使うとモックを作りづらくなる。
なのでインターフェイスと非staticで定義。
DIP:具象に依存せず、抽象に依存する。
factoryメソッド名はcreateが慣習。
interface DataWriter {
void write(Data d);
}
class DataWriterFactory {
DataWriter create(FileType type) {
if (type == FileType.CSV) return new CsvWriter();
if (type == FileType.XLSX) return new XlsxWriter();
if (type == FileType.HTML) return new HtmlWriter();
throw new IllegalArgumentException("不正なファイルタイプ" + fileType);
}
}factory methodパターンはこれと異なる。
template methodパターンの亜種のようなもので、メソッド内で使うクラスの生成メソッドを具象クラスで実装する感じ。
abstract factoryは関連するオブジェクト群を生成