3

デフォルトでドメイン オブジェクト ファクトリにインターフェイスを使用することは理にかなっていますか? それとも、必要な場合にのみインターフェイスをファクトリ クラス用に予約する必要がありますか?

public IUserFactory
{
    User CreateNewUser();
}

public UserFactory : IUserFactory
{
    public User CreateNewUser()
    {
        return new User();
    }
}
4

5 に答える 5

7

あなたの例では、工場に行く必要がある理由さえわかりません。

Factory パターンの本質は、「オブジェクトを作成するためのインターフェイスを定義しますが、どのクラスをインスタンス化するかはサブクラスに任せます。Factory メソッドを使用すると、クラスはインスタンス化をサブクラスに任せることができます。」- ウィキペディア

別のタイプのユーザーがいますか、それともユーザー自体が何かのタイプです。あなたは物事を明確に詳しく説明していないかもしれません。通常、関連するオブジェクトの複数のファミリを処理する必要がある抽象ファクトリ メソッド patternでインターフェイスを使用します。

注: 忘れないでください。パターンは私たちを助けるためにあります。必要かどうかに関係なく、パターンが利用可能であるために使用しなければならないという意味ではありません。

于 2009-01-08T03:36:15.573 に答える
5

すべてにインターフェイスが必要なわけではありません。何かの単一の実装があり、他に実装する理由がない場合、インターフェイスを定義する理由がわかりません。

于 2009-01-08T03:21:26.990 に答える
2

インターフェイスからファクトリを作成すると、モック クラスを使用してそれらをテストしやすくなり、IoC アプリケーションを簡単に使用できるようになります。そのため、アプリケーションの機能のために必ずしもそれらを必要としない場合もありますが、通常はインターフェイスを介してほとんどのクラスを構築および呼び出します。 .

ユニット テストや IoC パターンを検討していない場合 (宗教的な意見は別として)、私は気にしないでしょう。

少なくともVisual Studioでそれらを使用する際の最大の問題は、プロパティまたは関数の「定義へ移動」がクラス定義ではなくインターフェイス定義にジャンプすることです。

于 2009-01-08T03:30:22.277 に答える
2

2 つのこと: (1) インターフェイスを作成する前に、別の実装が必要になるまで (または差し迫った必要性が見られるまで) 待っていました。すぐにインターフェイスが必要になります。

于 2009-01-08T03:31:07.160 に答える
2

これは、同じ問題を Java に翻訳したものです。

元の例

public interface UserFactoryIF
{
   User createNewUser();
}

次に、Factory の実装

public class UserFactory implements UserFactoryIF
{
     public User createNewUser()
     {
         // whatever special logic it takes to make a User
         // below is simplification
         return new User();
     }
}

集中プロデューサに対して単一のインターフェースを定義しているので、ファクトリのインターフェースを定義することに特別な利点はありません。通常、同じ種類の製品のさまざまな実装を作成する必要があり、ファクトリはさまざまな種類のパラメーターを使用する必要があります。つまり、次のようになります。

public interface User
{
    public String getName();
    public long getId();
    public long getUUID();
    // more biz methods on the User
}

工場は次のようになります。

public class UserFactory {

    public static User createUserFrom(Person person) {
        // ...
        return new UserImpl( ... );
    }

    public static user createUserFrom(AmazonUser amazonUser) {
         // ... special logic for AmazonWS user
        return new UserImpl( ... );          
    }

    private static class UserImpl implements User {
       // encapsulated impl with validation semantics to
       // insure no one else in the production code can impl
       // this naively with side effects
    }
}

これが要点を理解してくれることを願っています。

于 2009-01-08T04:01:23.353 に答える