ファクトリーメソッドパターン

ファクトリーメソッドパターン(Factory Method Pattern)は、ソフトウェアデザインパターンの一つで、特にオブジェクトの生成に関するパターンです。このパターンは、オブジェクトを生成するためのインターフェースを提供し、具体的な生成処理をサブクラスに委譲する方法を提供します。これにより、クライアントコードは具体的なオブジェクトのクラスを直接指定するのではなく、生成用のインターフェースを介してオブジェクトを作成できます。

ファクトリーメソッドパターンの主な要素

ファクトリーメソッド(Factory Method)

インターフェースまたは抽象クラス内に定義されたメソッドで、具体的なオブジェクトの生成処理をカプセル化しますこのメソッドをオーバーライドして具体の生成ロジックを提供するサブクラスがあります

具体的なファクトリークラス(Concrete Factory Class)

ファクトリーメソッドを実装し、特定のオブジェクトのインスタンスを生成する責任を持つクラスです
通常、異なる種類のオブジェクトを生成するために複数の具体的なファクトリークラスが存在します

クライアント(Client)

クライアントコードはファクトリーメソッドを介してオブジェクトを生成し、具体的なクラスの詳細に依存せずにオブジェクトを使用できます

ファクトリーメソッドパターンの主な利点は、クライアントコードと具体的なオブジェクトのクラスとの結びつきを緩和し、柔軟性を提供することです。新しいオブジェクトタイプが追加される場合、既存のクライアントコードを変更せずに、新しいファクトリークラスを追加して新しいオブジェクトを生成できます。これにより、コードの保守性が向上し、変更が容易になります。

ファクトリーメソッドパターンは、Creational Design Patterns(生成パターン)の一部として広く使用されており、多くのソフトウェアプロジェクトで採用されています。

サンプル

C#でファクトリーメソッドパターンを実装するサンプルコードを示します
この例では、シンプルなファクトリーメソッドパターンを使用して、異なる種類のペンを生成します
まず、ペンの抽象クラスとそれを実装する具体的なクラスを作成します

using System;

// 抽象製品: ペン
public abstract class Pen
{
    public abstract void Write(string text);
}

// 具体的な製品: ボールペン
public class BallpointPen : Pen
{
    public override void Write(string text)
    {
        Console.WriteLine("ボールペンで書く: " + text);
    }
}

// 具体的な製品: フェルトペン
public class FeltTipPen : Pen
{
    public override void Write(string text)
    {
        Console.WriteLine("フェルトペンで書く: " + text);
    }
}

// ファクトリーインターフェース: ペン工場
public interface PenFactory
{
    Pen CreatePen();
}

// 具体的なファクトリー: ボールペン工場
public class BallpointPenFactory : PenFactory
{
    public Pen CreatePen()
    {
        return new BallpointPen();
    }
}

// 具体的なファクトリー: フェルトペン工場
public class FeltTipPenFactory : PenFactory
{
    public Pen CreatePen()
    {
        return new FeltTipPen();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // ペン工場を使ってペンを作成
        PenFactory ballpointFactory = new BallpointPenFactory();
        PenFactory feltTipFactory = new FeltTipPenFactory();

        Pen ballpointPen = ballpointFactory.CreatePen();
        Pen feltTipPen = feltTipFactory.CreatePen();

        // ペンで書く
        ballpointPen.Write("こんにちは、ボールペン");
        feltTipPen.Write("こんにちは、フェルトペン");
    }
}

このコードでは、Pen クラスが抽象製品を表し、BallpointPen と FeltTipPen が具体的な製品を表します
PenFactory インターフェースがファクトリーメソッドを定義し、BallpointPenFactory と FeltTipPenFactory が具体的なファクトリークラスを実装します
Main メソッドでは、ファクトリーを使用して異なる種類のペンを生成し、それぞれでテキストを書いています

このサンプルコードは、ファクトリーメソッドパターンを使用して、異なるペンの種類を生成する方法を示しています