Featured image of post Factory Methodパターン調査ドキュメント

Factory Methodパターン調査ドキュメント

Factory Methodパターンに関する調査結果(GoFデザインパターン)

Factory Methodパターン調査ドキュメント

調査概要

  • 調査目的: 「Mooで覚えるオブジェクト指向プログラミング」シリーズを読了した読者が、Factory Methodパターンを学べる教材作成のための基礎資料
  • 調査実施日: 2026年1月9日
  • 技術スタック: Perl v5.36以降 / Moo
  • 想定読者: オブジェクト指向の基礎(クラス、継承)が理解できている読者
  • 難易度評価: 3/5(インターフェースや継承、抽象クラスの理解が必要)
  • 前提知識: 「Mooで覚えるオブジェクト指向プログラミング」シリーズ(全12回)を読了済み

1. Factory Methodパターンの基礎

1.1 定義と目的

要点:

  • Factory Methodパターンは、GoF(Gang of Four)の**生成パターン(Creational Patterns)**の1つ
  • 「オブジェクトを生成するためのインターフェースを定義し、どのクラスをインスタンス化するかはサブクラスに決定させる」
  • クラスのインスタンス化をサブクラスに遅延させることで、クライアントコードを具体的なクラスから分離する
  • 継承を使って「どのオブジェクトを作るか」をサブクラスに委ねる

根拠:

  • GoF書籍「Design Patterns: Elements of Reusable Object-Oriented Software」(1994年)で定義
  • Refactoring Guru、GeeksforGeeks、Wikipedia等の主要技術サイトで一致した説明

仮定:

  • 読者は「Mooで覚えるオブジェクト指向プログラミング」シリーズで継承(extends)を学んでいる
  • 「Mooを使ってディスパッチャーを作ってみよう」シリーズでStrategy パターンを学んでいる可能性が高い

出典:

信頼度: 9/10(GoF原典および複数の信頼できる技術サイト)


1.2 GoFパターンにおける位置づけ

要点:

Factory Methodは、GoFの23パターンのうち生成パターン(Creational Patterns)5種類の1つです。

パターン名概要
Singletonクラスのインスタンスが1つだけであることを保証し、グローバルアクセスポイントを提供
Factory Methodオブジェクト生成のインターフェースを定義し、サブクラスがインスタンス化するクラスを決定
Abstract Factory関連するオブジェクト群を、具体クラスを指定せずに生成するインターフェースを提供
Builder複雑なオブジェクトの構築プロセスを段階的に行い、同じ構築過程で異なる表現を可能にする
Prototype既存のインスタンスをコピー(クローン)して新しいオブジェクトを作成

根拠:

  • GoFの分類体系で明確に定義されている
  • 生成パターンはオブジェクトの生成メカニズムに関するパターン

出典:

信頼度: 9/10


1.3 他の生成パターンとの違い

Simple Factory との違い(注意: これはGoFパターンではない)

項目Simple FactoryFactory Method
パターン分類GoFパターンではない(イディオム)GoFの生成パターン
生成ロジック単一のメソッド内に集約サブクラスに委譲
拡張性新製品追加時に既存コード修正が必要新しいサブクラス追加で拡張可能
継承の使用ほとんど使用しない中心的な概念
if/switch条件分岐で製品を選択ポリモーフィズムで製品を選択
複雑度低い中程度

コード例(Simple Factory):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# Simple Factory - if/elseで分岐
package SimpleShapeFactory;
use strict;
use warnings;

sub create_shape {
    my ($class, $type) = @_;
    if ($type eq 'circle') {
        require Circle;
        return Circle->new();
    }
    elsif ($type eq 'square') {
        require Square;
        return Square->new();
    }
    else {
        die "Unknown shape type: $type";
    }
}
1;

根拠:

  • Simple Factoryはif/else/switchを使用するため、新製品追加時にファクトリクラスの修正が必要(OCP違反)
  • Factory Methodは新しいCreatorサブクラスを追加することで拡張可能(OCP準拠)

出典:

信頼度: 9/10


Abstract Factory との違い

項目Factory MethodAbstract Factory
生成対象単一の製品関連する製品群(ファミリー)
拡張方向新製品タイプの追加が容易新しいファミリーの追加が容易
実現方法継承(サブクラス化)合成(オブジェクトの組み合わせ)
ファクトリの数Creatorクラス1つに対し1つの製品1つのファクトリで複数の製品を生成
典型例ShapeCreator → Circle/SquareWindowsFactory → WindowsButton + WindowsMenu
複雑度中程度高い

根拠:

  • Factory Methodは単一製品の生成にフォーカス
  • Abstract Factoryは関連する製品群(ファミリー)の一貫した生成にフォーカス

出典:

信頼度: 9/10


Builder との違い

項目Factory MethodBuilder
生成プロセス1ステップで生成複数ステップで段階的に構築
製品の複雑さ比較的シンプルな製品複雑な製品(多くの構成要素)
生成結果異なるクラスのインスタンス同じクラスの異なる構成
典型例createDocument() → PDF/Wordbuild().setTitle().setBody().create()

信頼度: 9/10


Prototype との違い

項目Factory MethodPrototype
生成方法new でインスタンス化既存オブジェクトのクローン
使用場面クラス階層に基づく生成既存オブジェクトをベースにした生成
典型例createShape()$prototype->clone()

信頼度: 9/10


2. Factory Methodパターンの構造

2.1 UML図

	classDiagram
    class Creator {
        <<abstract>>
        +factoryMethod() Product
        +someOperation()
    }
    class ConcreteCreatorA {
        +factoryMethod() Product
    }
    class ConcreteCreatorB {
        +factoryMethod() Product
    }
    class Product {
        <<interface>>
        +doStuff()
    }
    class ConcreteProductA {
        +doStuff()
    }
    class ConcreteProductB {
        +doStuff()
    }
    
    Creator <|-- ConcreteCreatorA
    Creator <|-- ConcreteCreatorB
    Product <|.. ConcreteProductA
    Product <|.. ConcreteProductB
    ConcreteCreatorA ..> ConcreteProductA : creates
    ConcreteCreatorB ..> ConcreteProductB : creates
    Creator --> Product : uses

テキスト版UML:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    +-------------------+                    +-------------------+
    |   <<abstract>>    |                    |   <<interface>>   |
    |     Creator       |                    |      Product      |
    +-------------------+                    +-------------------+
    | +factoryMethod()  |----uses--->        | +doStuff()        |
    | +someOperation()  |                    +-------------------+
    +-------------------+                            ^
            ^                                        |
            |                               +--------+--------+
    +-------+-------+                       |                 |
    |               |                +-------------+   +-------------+
+-------------------+  +-------------------+  | ConcreteProductA |   | ConcreteProductB |
| ConcreteCreatorA  |  | ConcreteCreatorB  |  +------------------+   +------------------+
+-------------------+  +-------------------+  | +doStuff()       |   | +doStuff()       |
| +factoryMethod()  |  | +factoryMethod()  |  +------------------+   +------------------+
+-------------------+  +-------------------+
        |                      |
        |                      |
   creates                creates
        |                      |
        v                      v
+------------------+   +------------------+
| ConcreteProductA |   | ConcreteProductB |
+------------------+   +------------------+

信頼度: 9/10


2.2 構成要素の説明

要素役割Perl/Moo実装での具体例
Creator(作成者)ファクトリメソッドを宣言する抽象クラス。製品を使用するビジネスロジックを持つDocumentCreator(抽象クラス、factoryMethodを宣言)
ConcreteCreator(具象作成者)ファクトリメソッドを実装し、具体的な製品を生成するサブクラスPdfCreator, WordCreator
Product(製品)ファクトリメソッドが生成するオブジェクトの共通インターフェースDocument(Moo::Role、requires 'render'
ConcreteProduct(具象製品)Productインターフェースを実装する具体的なクラスPdfDocument, WordDocument

要点:

  • Creatorはファクトリメソッド(factoryMethod)を宣言し、サブクラスが実装
  • Creatorは製品を「使う」ビジネスロジック(someOperation)も持つことができる
  • ConcreteCreatorは具体的な製品クラスのインスタンスを返す
  • クライアントはCreator経由で製品を取得し、Productインターフェースで操作

根拠:

  • GoF原典の構造定義
  • UMLBoard、Visual Paradigm等のUML解説サイト

出典:

信頼度: 9/10


3. メリット・デメリット

3.1 メリット

メリット説明実践的な効果
疎結合(Loose Coupling)クライアントコードは具体クラスではなくインターフェースに依存製品クラスの変更がクライアントに影響しない
拡張性(OCP準拠)新しい製品タイプを追加しても既存コードを修正不要機能追加が容易
単一責任の原則(SRP)製品の生成ロジックが1箇所に集約コードの保守性向上
テスト容易性ファクトリをモック化して製品の挙動をテスト可能ユニットテストが書きやすい
インスタンス化の制御サブクラスがどのクラスをインスタンス化するか決定柔軟なオブジェクト生成
フレームワーク構築に最適フレームワークがスケルトンを提供し、ユーザーがカスタマイズ拡張ポイントの明確化

根拠:

  • SOLID原則(特にOCP、SRP、DIP)との親和性
  • 実務での拡張性・保守性の向上

出典:

信頼度: 9/10


3.2 デメリット

デメリット説明対策
クラス数の増加各製品タイプに対してCreatorサブクラスが必要製品タイプが少ない場合はSimple Factoryを検討
複雑性の増加継承階層が深くなる可能性パターンの適用判断を慎重に
サブクラス化の強制新製品追加にはサブクラス作成が必要少数の製品なら過剰設計を避ける
並行処理時の考慮スレッドセーフ性の確保が必要な場合がある適切な同期機構を導入

根拠:

  • 過剰設計(オーバーエンジニアリング)のリスク
  • 実務での経験則

出典:

信頼度: 9/10


3.3 いつ使うべきか

適用すべき場面:

  1. クラスが生成すべきオブジェクトのクラスを事前に知らない場合

    • 実行時やユーザー入力に基づいて生成するクラスが決まる
  2. サブクラスに生成すべきオブジェクトを指定させたい場合

    • フレームワークが骨格を提供し、ユーザーがカスタマイズ
  3. オブジェクト生成ロジックを局所化・カプセル化したい場合

    • 生成ロジックの変更がシステム全体に影響しない
  4. Open/Closed原則に従いたい場合

    • 既存コードを修正せずに新しい製品タイプを追加
  5. プラグインアーキテクチャを構築したい場合

    • プラグインが自身の製品を提供

根拠:

  • GoF原典での適用条件
  • 実務でのユースケース

出典:

信頼度: 9/10


3.4 いつ使うべきでないか

適用すべきでない場面:

  1. 製品タイプが1〜2個で、今後も増えない見込みの場合

    • Simple Factoryまたは直接インスタンス化で十分
  2. オブジェクト生成がシンプルで、複雑なロジックが不要な場合

    • パターン適用によるオーバーヘッドがメリットを上回る
  3. 継承を避けたい設計方針の場合

    • 合成ベースのパターン(Abstract Factory、依存性注入)を検討
  4. 動的に製品タイプを追加する必要がない場合

    • 静的なファクトリメソッドで十分

信頼度: 9/10


3.5 アンチパターンへの注意点

アンチパターン説明回避策
God Factory1つのファクトリがすべての製品を生成責任を分割し、複数のファクトリに分ける
過剰な抽象化不必要なインターフェースやクラスの追加必要性を慎重に評価
Factory Method内での分岐ファクトリメソッド内でif/elseを使用Simple Factoryと混同しないよう注意
創造と使用の混在Creatorが製品の使用ロジックも持ちすぎる適切な責任分離

信頼度: 7/10


4. 実装例

4.1 Perl/Moo での実装例

Product Role(製品インターフェース)

1
2
3
4
5
6
7
8
9
# Document.pm
package Document;
use Moo::Role;
use v5.36;

requires 'render';
requires 'get_extension';

1;

Concrete Products(具象製品)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# PdfDocument.pm
package PdfDocument;
use Moo;
use v5.36;
with 'Document';

sub render ($self) {
    say "PDF形式でドキュメントをレンダリングします";
}

sub get_extension ($self) {
    return '.pdf';
}

1;

# WordDocument.pm
package WordDocument;
use Moo;
use v5.36;
with 'Document';

sub render ($self) {
    say "Word形式でドキュメントをレンダリングします";
}

sub get_extension ($self) {
    return '.docx';
}

1;

# HtmlDocument.pm
package HtmlDocument;
use Moo;
use v5.36;
with 'Document';

sub render ($self) {
    say "HTML形式でドキュメントをレンダリングします";
}

sub get_extension ($self) {
    return '.html';
}

1;

Creator(抽象作成者)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# DocumentCreator.pm
package DocumentCreator;
use Moo;
use v5.36;

# Factory Method - サブクラスで実装
sub create_document ($self) {
    die "create_document() must be implemented by subclass";
}

# ビジネスロジック - 製品を使用する
sub generate_report ($self, $title) {
    my $doc = $self->create_document();
    say "レポート '$title' を" . $doc->get_extension() . "形式で生成中...";
    $doc->render();
    return $doc;
}

1;

Concrete Creators(具象作成者)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# PdfCreator.pm
package PdfCreator;
use Moo;
use v5.36;
extends 'DocumentCreator';
use PdfDocument;

sub create_document ($self) {
    return PdfDocument->new();
}

1;

# WordCreator.pm
package WordCreator;
use Moo;
use v5.36;
extends 'DocumentCreator';
use WordDocument;

sub create_document ($self) {
    return WordDocument->new();
}

1;

# HtmlCreator.pm
package HtmlCreator;
use Moo;
use v5.36;
extends 'DocumentCreator';
use HtmlDocument;

sub create_document ($self) {
    return HtmlDocument->new();
}

1;

使用例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# main.pl
use v5.36;
use PdfCreator;
use WordCreator;
use HtmlCreator;

# PDF形式でレポート生成
my $pdf_creator = PdfCreator->new();
$pdf_creator->generate_report("売上レポート");
# 出力:
# レポート '売上レポート' を.pdf形式で生成中...
# PDF形式でドキュメントをレンダリングします

# Word形式でレポート生成
my $word_creator = WordCreator->new();
$word_creator->generate_report("月次報告書");
# 出力:
# レポート '月次報告書' を.docx形式で生成中...
# Word形式でドキュメントをレンダリングします

# HTML形式でレポート生成
my $html_creator = HtmlCreator->new();
$html_creator->generate_report("Webレポート");
# 出力:
# レポート 'Webレポート' を.html形式で生成中...
# HTML形式でドキュメントをレンダリングします

根拠:

  • Moo::Roleのrequiresでインターフェースを定義
  • extendsで継承を実現
  • v5.36のシグネチャでモダンPerlの記法

出典:

信頼度: 9/10


4.2 他言語との比較

Java での実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Product interface
interface Document {
    void render();
    String getExtension();
}

// Concrete Product
class PdfDocument implements Document {
    public void render() {
        System.out.println("PDF形式でレンダリング");
    }
    public String getExtension() { return ".pdf"; }
}

// Creator (abstract class)
abstract class DocumentCreator {
    // Factory Method
    public abstract Document createDocument();
    
    // Business logic
    public void generateReport(String title) {
        Document doc = createDocument();
        System.out.println("レポート '" + title + "' を生成中...");
        doc.render();
    }
}

// Concrete Creator
class PdfCreator extends DocumentCreator {
    @Override
    public Document createDocument() {
        return new PdfDocument();
    }
}

Python での実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from abc import ABC, abstractmethod

# Product interface
class Document(ABC):
    @abstractmethod
    def render(self) -> None:
        pass
    
    @abstractmethod
    def get_extension(self) -> str:
        pass

# Concrete Product
class PdfDocument(Document):
    def render(self) -> None:
        print("PDF形式でレンダリング")
    
    def get_extension(self) -> str:
        return ".pdf"

# Creator (abstract class)
class DocumentCreator(ABC):
    @abstractmethod
    def create_document(self) -> Document:
        pass
    
    def generate_report(self, title: str) -> None:
        doc = self.create_document()
        print(f"レポート '{title}' を生成中...")
        doc.render()

# Concrete Creator
class PdfCreator(DocumentCreator):
    def create_document(self) -> Document:
        return PdfDocument()

TypeScript での実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Product interface
interface Document {
    render(): void;
    getExtension(): string;
}

// Concrete Product
class PdfDocument implements Document {
    render(): void {
        console.log("PDF形式でレンダリング");
    }
    getExtension(): string {
        return ".pdf";
    }
}

// Creator (abstract class)
abstract class DocumentCreator {
    abstract createDocument(): Document;
    
    generateReport(title: string): void {
        const doc = this.createDocument();
        console.log(`レポート '${title}' を生成中...`);
        doc.render();
    }
}

// Concrete Creator
class PdfCreator extends DocumentCreator {
    createDocument(): Document {
        return new PdfDocument();
    }
}

言語間比較表

言語インターフェース定義抽象クラス抽象メソッド宣言
Perl/MooMoo::Role + requires基底クラス + 例外スローdie "must implement"
Javainterfaceabstract classabstract キーワード
PythonABC + @abstractmethodABCを継承@abstractmethod
TypeScriptinterfaceabstract classabstract キーワード

信頼度: 9/10


5. 実世界での活用例

5.1 フレームワークでの活用

Spring Framework(Java)

要点:

  • Spring DIコンテナは内部的にFactory Methodパターンを活用
  • factory-method属性でBean生成をカスタマイズ可能
  • BeanFactoryがFactory Methodの代表例

出典:

信頼度: 9/10


Ruby on Rails

要点:

  • ActiveRecordの接続アダプターはFactory Method的な構造
  • 接続管理が抽象化され、DBドライバに応じた具象クラスを返す

信頼度: 7/10


5.2 ドキュメント生成システム

要点:

  • PDF、Word、Text、HTML等の複数形式に対応
  • ユーザー入力や設定に基づいて適切なDocument生成器を選択
  • 新しい形式の追加が容易

典型的な実装:

  1. DocumentCreatorが抽象ファクトリメソッドcreateDocument()を宣言
  2. PdfCreatorWordCreator等がそれぞれの形式を生成
  3. クライアントはDocumentCreator経由で製品を取得

出典:

信頼度: 9/10


5.3 ログシステム

要点:

  • ConsoleLogger、FileLogger、DatabaseLogger等を切り替え
  • 実行環境や設定に応じてロガーを選択
  • 新しいロギング先の追加が容易

出典:

信頼度: 9/10


5.4 通知システム

要点:

  • Email、SMS、Push通知、Slack等の複数チャネル対応
  • 設定やユーザー設定に応じて通知方法を選択
  • 新しい通知チャネルの追加が容易

出典:

信頼度: 9/10


5.5 GUI要素の生成

要点:

  • ボタン、ダイアログ、入力フォーム等のUI要素
  • OSやテーマに応じた外観のカスタマイズ
  • クロスプラットフォーム対応

典型例:

  • WindowsButtonCreator、MacButtonCreator
  • Material UIボタン、iOS風ボタン

信頼度: 7/10


6. 関連パターン

6.1 Template Methodパターンとの関係

要点:

  • Factory MethodはTemplate Methodの特殊化と見なすことができる
  • Template Methodは「アルゴリズムの骨格を定義し、一部のステップをサブクラスに委ねる」
  • Factory Methodは「オブジェクト生成」という特定のステップをサブクラスに委ねる
項目Factory MethodTemplate Method
分類生成パターン(Creational)振る舞いパターン(Behavioral)
カスタマイズ対象オブジェクトの生成アルゴリズムのステップ
スーパークラスの役割ファクトリメソッドを宣言アルゴリズムの骨格を定義
サブクラスの役割具体的なオブジェクトを生成特定のステップを実装
関係Template Methodの特殊化(生成に特化)より一般的なパターン

根拠:

  • GoF書籍での定義
  • 両パターンとも継承を活用してカスタマイズポイントを提供

出典:

信頼度: 9/10


6.2 Abstract Factoryパターンとの違い(再掲・詳細)

要点:

  • Factory Methodは1つの製品の生成にフォーカス
  • Abstract Factoryは**関連する製品群(ファミリー)**の生成にフォーカス
  • Factory Methodは継承ベース、Abstract Factoryは合成ベース
  • Abstract FactoryはFactory Methodを内部的に使用することが多い

関係図:

	flowchart LR
    A[Abstract Factory] -->|内部で使用| B[Factory Method]
    B -->|単一製品の生成| C[Product]
    A -->|製品群の生成| D[Product Family]

出典:

信頼度: 9/10


6.3 Simple Factory(Static Factory)との違い(再掲・詳細)

要点:

  • Simple FactoryはGoFパターンではない(プログラミングイディオム)
  • 単一のメソッド内でif/else/switchを使って製品を選択
  • 新製品追加時にファクトリクラスの修正が必要(OCP違反)
  • シンプルで理解しやすいが、拡張性に欠ける

使い分け指針:

状況推奨パターン
製品タイプが少なく、増えないSimple Factory
製品タイプが増える可能性があるFactory Method
設定やプラグインで製品を追加したいFactory Method + 登録機構

信頼度: 9/10


7. 競合記事の分析

7.1 日本語の主要記事

記事タイトルURL特徴差別化ポイント
Refactoring Guru(日本語)https://refactoring.guru/ja/design-patterns/factory-method図解豊富、多言語コード例Perl非対応
GeeksforGeekshttps://www.geeksforgeeks.org/system-design/factory-method-for-designing-pattern/網羅的、実装例豊富Java/Python中心
Qiita - Factory Method各種日本語解説個人ブログ品質にばらつき

7.2 差別化ポイントの抽出

既存記事の問題点:

  1. Perl/Moo特化の記事が少ない: 日本語でPerl向けのFactory Method解説は希少
  2. 抽象的な例が多い: 動物、図形など、実践性の低い例
  3. 前提知識の説明不足: いきなりパターンの説明から始まる
  4. 他の生成パターンとの違いが曖昧: 読者が使い分けに困る

本教材シリーズの強み:

  1. 前シリーズとの継続性: 「Mooで覚えるオブジェクト指向プログラミング」で学んだ概念を活用
  2. Strategyパターンとの対比: 「Mooを使ってディスパッチャーを作ってみよう」で学んだパターンとの違いを明確化
  3. 段階的な難易度: 1記事1概念、コード例2つまでの制約
  4. Perl/Moo特化: v5.36対応のモダンPerl記法
  5. 生成パターンの体系的理解: 他の生成パターンとの違いを明確に

信頼度: 9/10


8. 内部リンク候補の調査

8.1 「Mooで覚えるオブジェクト指向プログラミング」シリーズ(全12回)

本シリーズ記事の前提知識となる既存記事。

タイトル内部リンクFactory Methodとの関連
第1回Mooで覚えるオブジェクト指向プログラミング/2021/10/31/191008/OOPの基礎
第2回データとロジックをまとめよう/2025/12/30/163810/hassub
第3回同じものを何度も作れるように/2025/12/30/163811/new(コンストラクタ)
第7回関連するデータを別のクラスに/2025/12/30/163815/オブジェクトの関連
第8回似ているクラスの重複をなくす/2025/12/30/163816/extends(継承)★重要
第9回同じ名前で違う動作を/2025/12/30/163817/オーバーライド
第10回継承しないで振る舞いを共有/2025/12/30/163818/Moo::Rolewith(Productインターフェースの基礎)
第12回型チェックでバグを未然に防ぐ/2025/12/30/163820/isadoes(型制約)

特に重要な関連:

  • 第8回(継承): Factory Methodは継承を中心に据えたパターン
  • 第10回(Moo::Role): Product インターフェースをRoleで定義する際に必須

8.2 「Mooを使ってディスパッチャーを作ってみよう」シリーズ(全12回)

Strategy パターンを扱うシリーズ:Factory Methodとの違いを理解する上で参考になる。

タイトル内部リンク関連度
第12回これがデザインパターンだ!/2026/01/03/001541/最高(Strategyパターンの解説、Factory Methodへの言及あり)

8.3 デザインパターン関連

ドキュメント内容関連度
/content/warehouse/design-patterns-overview.mdデザインパターン概要(GoF 23パターン分類)最高
/content/warehouse/design-patterns-research.mdGoF 23パターン調査
/content/warehouse/strategy-pattern.mdStrategyパターン詳細調査(比較対象)
/content/warehouse/command-pattern.mdCommandパターン調査
/content/warehouse/moo-dispatcher-series-research.mdディスパッチャーシリーズ調査
/content/warehouse/moo-oop-series-research.mdMoo OOPシリーズ調査

8.4 Moo/オブジェクト指向関連

ファイルパス内容内部リンク関連度
/content/post/2016/02/21/150920.mdよなべPerlでMooについて喋った/2016/02/21/150920/
/content/post/2015/09/17/072209.mdよなべPerlで講師(Moo、OOP)/2015/09/17/072209/
/content/post/2025/12/03/041603.mdPerl/Moo関連/2025/12/03/041603/

9. 既存シリーズとの重複チェック

9.1 「Mooで覚えるオブジェクト指向プログラミング」シリーズ

重複なし: このシリーズはOOPの基礎(クラス、継承、ロール等)を扱い、デザインパターンは直接扱っていない。Factory Methodシリーズの前提知識として位置づけられる。

9.2 「Mooを使ってディスパッチャーを作ってみよう」シリーズ

重複なし: このシリーズはStrategy パターン(振る舞いパターン)を扱う。Factory Methodは生成パターンであり、異なるアプローチ。

差別化ポイント:

項目StrategyパターンFactory Methodパターン
パターン分類振る舞いパターン生成パターン
主な関心アルゴリズムの切り替えオブジェクトの生成
焦点「どう処理するか」「何を作るか」
継承の使用少ない(合成が中心)中心的(サブクラス化)

9.3 「Mooを使ってデータエクスポーターを作ってみよう」シリーズ(Strategyパターン)

確認必要: Strategy パターンを別題材で扱うシリーズがある場合、Factory Methodシリーズとは明確に差別化される。

9.4 結論

Factory Methodパターンは生成パターンであり、既存シリーズで扱うStrategy パターン(振る舞いパターン)とは異なるカテゴリ。重複なく、新しいシリーズとして展開可能。


10. 参考文献・リソースリスト

10.1 必読リソース

書籍

書籍名著者ISBN/ASIN重要度
Design Patterns: Elements of Reusable Object-Oriented SoftwareGoF978-0201633610必須
Head First Design Patterns (2nd Edition)Eric Freeman, Elisabeth Robson978-1492078005推奨
Design Patterns in Modern PerlMohammad Sajid AnwarLeanpub推奨(Perl特化)
オブジェクト指向における再利用のためのデザインパターンGoF(日本語訳)4797311126推奨

Webリソース

リソース名URL特徴信頼度
Refactoring Guru - Factory Methodhttps://refactoring.guru/design-patterns/factory-method視覚的な図解、多言語コード例★★★★★
Wikipedia - Factory method patternhttps://en.wikipedia.org/wiki/Factory_method_pattern正式な定義★★★★★
GeeksforGeeks - Factory method Design Patternhttps://www.geeksforgeeks.org/system-design/factory-method-for-designing-pattern/網羅的な解説★★★★☆
Baeldung - Factory Method vs. Factory vs. Abstract Factoryhttps://www.baeldung.com/cs/factory-method-vs-factory-vs-abstract-factoryパターン間の比較★★★★★
The Weekly Challenge - Design Pattern Factoryhttps://theweeklychallenge.org/blog/design-pattern-factory/Perl/Moo実装例★★★★★
MetaCPAN - Moohttps://metacpan.org/pod/MooPerl Moo公式★★★★★
MetaCPAN - Moo::Rolehttps://metacpan.org/pod/Moo::RolePerl Moo::Role公式★★★★★
Perl Maven - OOP with Moohttps://perlmaven.com/oop-with-mooMooでのOOPチュートリアル★★★★☆
GitHub - simple-factory-p5https://github.com/peczenyj/simple-factory-p5Perl用ファクトリモジュール★★★★☆

11. 調査結果のサマリー

11.1 主要な発見

  1. Factory Methodの位置づけ: GoFの生成パターンの1つ。継承を活用してオブジェクト生成をサブクラスに委譲する

  2. Simple Factoryとの違い: Simple Factoryはif/elseで製品を選択(GoFパターンではない)。Factory Methodはサブクラス化で拡張(OCP準拠)

  3. Abstract Factoryとの違い: Factory Methodは単一製品、Abstract Factoryは製品群(ファミリー)を扱う

  4. Template Methodとの関係: Factory MethodはTemplate Methodの特殊化(生成に特化したTemplate Method)

  5. Perl/Moo実装の容易さ: Moo::RoleのrequiresでProductインターフェースを定義し、extendsでCreator継承、各ConcreteCreatorがファクトリメソッドをオーバーライド

  6. 既存シリーズとの連携: 「Mooで覚えるオブジェクト指向プログラミング」第8回(継承)、第10回(Moo::Role)が直接的な前提知識


調査完了日: 2026年1月9日 調査者: 調査・情報収集エージェント

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。