ファクトリーパターンとファクトリーメソッドパターンの違い(C#)

~ 武器を題材にした C# サンプル付き資料 ~

1. 概要

ファクトリーパターンは、オブジェクト生成の責任をクライアントコードから分離し、柔軟かつ拡張性のある設計を実現するための手法です。
その中のファクトリーメソッドパターンは、生成処理をサブクラスに委譲することで、具体的なインスタンスの生成方法を隠蔽し、必要に応じて変更できる仕組みを提供します。


2. ファクトリーパターン全体について

  • 目的:
    クライアントコードが直接具体的なクラス(今回の例では「武器」)を生成しないようにし、拡張時の影響範囲を限定する。
  • バリエーション:
    • シンプルファクトリーパターン
    • ファクトリーメソッドパターン
    • 抽象ファクトリーパターン

3. ファクトリーメソッドパターンの特徴

  • 概要:
    抽象クラスまたはインターフェース内に、オブジェクト生成のための抽象メソッド(ファクトリーメソッド)を定義し、サブクラスでその実装を行う。
  • 利点:
    • 生成するオブジェクト(ここでは「武器」)の種類をサブクラスごとに柔軟に決定できる。
    • 新たな武器クラスが増えても、既存のクライアントコードに影響を与えずに拡張が可能となる。

4. C#によるサンプルコード(武器を題材、Allmanスタイル)

using System;

namespace WeaponFactorySample
{
    // 1. 武器(Weapon)のインターフェース
    public interface IWeapon
    {
        void Attack();
    }

    // 2. 具体的な武器:剣
    public class Sword : IWeapon
    {
        public void Attack()
        {
            Console.WriteLine("剣による攻撃!");
        }
    }

    // 3. 具体的な武器:弓
    public class Bow : IWeapon
    {
        public void Attack()
        {
            Console.WriteLine("弓による攻撃!");
        }
    }

    // 4. クリエーター(WeaponCreator)抽象クラス
    public abstract class WeaponCreator
    {
        // ファクトリーメソッド:サブクラスで具体的な武器生成を実装
        public abstract IWeapon CreateWeapon();

        // 共通処理:生成した武器で攻撃を実行
        public void AttackWithWeapon()
        {
            IWeapon weapon = CreateWeapon();
            weapon.Attack();
        }
    }

    // 5. 具体的なクリエーター:SwordCreator(剣を生成)
    public class SwordCreator : WeaponCreator
    {
        public override IWeapon CreateWeapon()
        {
            return new Sword();
        }
    }

    // 6. 具体的なクリエーター:BowCreator(弓を生成)
    public class BowCreator : WeaponCreator
    {
        public override IWeapon CreateWeapon()
        {
            return new Bow();
        }
    }

    // 7. テストプログラム
    public class Program
    {
        public static void Main()
        {
            // 剣を生成して攻撃
            WeaponCreator swordCreator = new SwordCreator();
            swordCreator.AttackWithWeapon();

            // 弓を生成して攻撃
            WeaponCreator bowCreator = new BowCreator();
            bowCreator.AttackWithWeapon();
        }
    }
}

サンプルコードのポイント:

  • インターフェース IWeapon
    武器の基本的な機能(ここでは Attack メソッド)を定義し、各武器クラスの共通仕様としています。
  • 具体的な武器クラス SwordBow
    IWeapon インターフェースを実装し、それぞれ固有の攻撃メッセージを出力します。
  • 抽象クラス WeaponCreator
    ファクトリーメソッド CreateWeapon を抽象メソッドとして定義し、共通処理 AttackWithWeapon 内で生成した武器の Attack メソッドを呼び出します。
  • 具体的クリエーター SwordCreatorBowCreator
    抽象メソッドをオーバーライドし、各自の武器インスタンス(剣、弓)を生成します。
  • クライアントコード(Program.Main
    具体的クリエーターを利用して、生成された武器を用いた攻撃処理を実行します。

5. まとめ

  • ファクトリーパターンは、オブジェクト生成の責任を分離することで、柔軟かつ拡張性のある設計を実現するための手法です。
  • ファクトリーメソッドパターンは、生成処理をサブクラスに委譲することで、具体的な生成方法をカプセル化し、変更に強い設計を可能にします。
  • 上記の武器を題材としたサンプルコードでは、各クリエーターが異なる武器(剣や弓)を生成する仕組みを通じ、どのようにしてオブジェクト生成を柔軟に管理できるかを示しています。