X(Twitter) Zenn GitHub RSS 共有

ファクトリーファミリー

作成日時: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. シンプルファクトリー

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(); }
}

どのパターンを使うべきか

シンプルファクトリー(元のコード)が適切な場合

ファクトリーメソッドパターンが適切な場合

訂正版の説明

元のドキュメントで「ファクトリーメソッド」という用語を使うなら、こう訂正すべきです:

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は関連するオブジェクト群を生成