C#上級

上級 C#で学ぶデザインパターン|ケーススタディ編

導入

デザインパターンは、ソフトウェア開発における課題解決のための強力なツールです。本記事では、特に「ファクトリーパターン」に焦点を当て、実際のプロジェクトにどのように適用できるかを考察します。架空のプロジェクトを通じて、ファクトリーパターンの実装方法と、その利点、注意点を探ります。

教科書レベルの解説(デザインパターン)

重要な概念の整理

ファクトリーパターンは、オブジェクトの生成を専門化するデザインパターンです。クライアントコードは、具体的なクラスを知ることなく、オブジェクトを生成することができます。このアプローチにより、コードの可読性と保守性が向上します。また、依存関係の注入やテストの容易さも促進されます。

コード例(C#)


public interface IProduct
{
    string GetName();
}

public class ConcreteProductA : IProduct
{
    public string GetName() => "Product A";
}

public class ConcreteProductB : IProduct
{
    public string GetName() => "Product B";
}

public class ProductFactory
{
    public static IProduct CreateProduct(string type)
    {
        switch (type)
        {
            case "A":
                return new ConcreteProductA();
            case "B":
                return new ConcreteProductB();
            default:
                throw new ArgumentException("Invalid product type");
        }
    }
}

コードの行ごとの解説

  1. public interface IProduct – 製品のインターフェースを定義します。
  2. public class ConcreteProductA : IProduct – IProductインターフェースを実装する具体的な製品Aのクラスです。
  3. public class ConcreteProductB : IProduct – IProductインターフェースを実装する具体的な製品Bのクラスです。
  4. public class ProductFactory – 製品のインスタンスを生成するファクトリークラスです。
  5. public static IProduct CreateProduct(string type) – 製品の種類に応じて適切なインスタンスを返す静的メソッドです。
  6. switch (type) – 入力された製品タイプに基づいて、適切な製品を生成します。

ケーススタディ編

架空のプロジェクトとして、オンラインストアのシステムを考えます。このシステムでは、異なる種類の製品(例:電子機器、衣料品、書籍など)を扱います。各製品には異なるプロパティやメソッドがあり、これらを管理するためにファクトリーパターンを使用します。

例えば、製品の種類が増えると、クライアントコードがそれに応じて変更されるのは避けたいところです。ファクトリーパターンを導入することで、クライアントは製品の具体的な実装を知らずに済むため、コードの変更に強くなります。また、将来的に新しい製品タイプを追加する際も、ファクトリーメソッドを拡張するだけで済みます。

ただし、落とし穴も存在します。ファクトリーパターンを過度に使用すると、クラスの数が増え、管理が煩雑になる可能性があります。適切なバランスを見極めることが重要です。

まとめ

  • ファクトリーパターンは、オブジェクト生成の柔軟性を提供します。
  • クライアントコードの変更を最小限に抑えることができます。
  • 新しい製品タイプの追加が容易になりますが、クラス数の増加には注意が必要です。