0

以下のような、条件付きロジックに基づいてオブジェクトをインスタンス化する必要があるシナリオでは、ファクトリ メソッド パターンを使用すると、if/elseif 条件の数が原因でクライアント コードが乱雑になるのを防ぐことができます (これは、条件が増えるとメンテナンスの悪夢にもなります)。ロジックのバリエーションが異なるため、製品を作成する必要があります)。

または、救助に来る可能性のある他のデザインパターンはありますか?

public interface IProduct
{
    void Method1();
}

public class ProductA : IProduct
{
    void Method1()
    {
    }
}

public class ProductB : IProduct
{
    void Method1()
    {
    }
}

public class ProductC : IProduct
{
    void Method1()
    {
    }
}

public class Client
{
    public void Test()
    {
        int count = 5;

        IProduct product;

        if (count < 10)
        {
            product = new ProductA();
        }
        else if (count == 10)
        {
            product = new ProductB();
        }
        else if (count > 10)
        {
            product = new ProductC();
        }

        product.Method1();


    }
}
4

2 に答える 2

5

ファクトリーパターンはまさにあなたが望むものであるように見えます:


public class ProductFactory
{
    public IProduct GetProduct(int count)
    {
        if (count < 10)
        {
            return new ProductA();
        }
        else if (count == 10)
        {
            return new ProductB();
        }
        else if (count > 10)
        {
            return new ProductC();
        }
    }
}

その後、クライアント コードがインスタンスを必要とする場所ならどこにでも移動できます。


public class Client
{
    public void Test()
    {
        ProductFactory factory = new ProductFactory();

        IProduct product = factory.GetProduct(5);

        product.Method1();
    }
}

于 2010-07-22T23:44:57.943 に答える
2

カーバー氏のソリューションが、GOFデザインパターンブックに記載されているファクトリパターンの構造に厳密に従っているとは思いません。ただし、これは非常に一般的なプログラミングイディオム(Simple Factory)であり、この設計にはおそらく良いアプローチです。

ファクトリパターンでは、ConcreteCreatorがCreatorから派生する必要があります。通常、クリエーターは製品の作成をコンクリートクリエーターに委任します。これは、将来新しいファクトリが追加される可能性がある場合に役立ちます。たとえば、より少ないリソースで特定の製品を製造できる新しい工場を作成した場合を想像してみてください(カウントは「リソース」のプロキシとして使用されます)。

    public interface IProduct
    {
      void PerformService();
    }

    public class ProductA : IProduct
    {
      public void PerformService()
      {
        Console.WriteLine("Product A's service.");
      }
    }

    public class ProductB : IProduct
    {
      public void PerformService()
      {
        Console.WriteLine("Product B's service.");
      }
    }

    public class ProductC : IProduct
    {
      public void PerformService()
      {
        Console.WriteLine("Product C's service.");
      }
    }

    abstract class ProductFactory
    {
      public abstract IProduct CreateProduct(int count);
    }

    class OriginalFactory : ProductFactory
    {
      public override IProduct CreateProduct(int count)
      {
        if (count < 10)
        {
          return new ProductA();
        }
        else if (count == 10)
        {
          return new ProductB();
        }
        else if (count > 10)
        {
          return new ProductC();
        }
        else
        {
          return null;
        }
      }
    }

    class NewFactory : ProductFactory
    {
      public override IProduct CreateProduct(int count)
      {
        if (count < 20)
        {
          return new ProductA();
        }
        else if (count == 20)
        {
          return new ProductB();
        }
        else if (count > 20)
        {
          return new ProductC();
        }
        else
        {
          return null;
        }
      }
    }

    public class FactoryTest
    {
      public void TestNew()
      {
        ProductFactory factory = new NewFactory();
        IProduct product = factory.CreateProduct(10); // Product B
        product.PerformService();
      }
      public void TestOld()
      {
        ProductFactory factory = new OriginalFactory();
        IProduct product = factory.CreateProduct(10); // Product A
        product.PerformService();
      }
    }
于 2010-10-22T20:56:18.700 に答える