0

特別なファクトリ クラスを必要とせず、具体的なクライアントに適切なパーツをインスタンス化させたい場合はどうすればよいでしょうか。クライアントはその部分から Hello() を呼び出す必要があります。それ以外の場所では、ファクトリ メソッドを特別な作成者クラスのメソッドにすることに重点が置かれています。しかし、ここではクライアントですぐに使用できます。これはまだファクトリ メソッドのパターンであり、以下に示すように使用することは正しいですか?

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            AClient c1 = new ClientUsingPart1();
            c1.Foo();
            AClient c2 = new ClientUsingPart2();
            c2.Foo();
            Console.ReadKey();
        }
    }

    abstract class AClient
    {
        public AClient() { this.ipart = Create(); }

        public void Foo() { ipart.Hello(); }
        // many other methods
        // ...
        public abstract IPart Create();  // factory method
        IPart ipart;
    }

    class ClientUsingPart1 : AClient
    {
        public override IPart Create() { return new Part1(); }
    }

    class ClientUsingPart2 : AClient
    {
        public override IPart Create() { return new Part2(); }
    }

    interface IPart
    {
        void Hello();
    }

    class Part1 : IPart
    {
        public void Hello() { Console.WriteLine("hello from part1"); }
    }
    class Part2 : IPart
    {
        public void Hello() { Console.WriteLine("hello from part2"); }
    }

}
4

2 に答える 2

0

これによると: 抽象ファクトリ パターンとファクトリ メソッドの違い 元の投稿に投稿したコードは、ファクトリ メソッド パターンの有効な使用法を示しているようです。重要なのは、ファクトリ メソッドはクラスのメソッドにすぎないということです。これは、作成されたオブジェクトの唯一のクライアントでもある可能性があります。

または別の方法: ファクトリ メソッドは public である必要はなく、作成されたオブジェクトを外部の世界に提供します。私の例では、Create() メソッドを保護する必要があります。

于 2012-07-22T20:55:45.600 に答える
0

達成する必要があるものに応じて、選択した IC コンテナーで依存性注入のいくつかを使用する必要があります。StructureMap、Autofac、Unit、Ninject、Castle Windsor はすべて非常に人気があります。IoC コンテナが具象クラスを構築したら、次のような構文をサポートする必要があります

foreach (var client in Container.Resolve<IEnumerable<AClient>>())
{
    client.Create();
}

StructureMap でこれを実現する方法について詳しくは、こちらをご覧ください:抽象クラスはインターフェースのように StructureMap で機能しますか?

于 2012-07-21T11:28:19.207 に答える