1

オブジェクトの新しいインスタンスを返すファクトリメソッドを作成しています。私のコードを使用している人が私のオブジェクトでパブリックコンストラクターを使用できないようにしたいと思います。これを行う方法はありますか?

これは通常どのように達成されますか:

public abstract class CarFactory
{
  public abstract ICar CreateSUV();
}

public class MercedesFactory : CarFactory
{
  public override ICar CreateSUV()
  {
    return new Mercedes4WD();
  }
}

次に、他の開発者(数か月以内に私を含む)がMercedes4WDのインスタンスを作成することを制限/防止したいと思います。しかし、彼らに私のファクトリメソッドを呼び出させます。方法?

4

6 に答える 6

2

Mercedes4WDファクトリを含むライブラリの外部からインスタンス化されるのを停止する内部コンストラクタを使用して、クラスを内部クラスにすることができます。

インスタンスを生成するファクトリメソッドをクラスに設定する方がよい場合があります。これは、ファクトリクラスから呼び出すことができますが、それは単に「更新」するのとそれほど違いはありません。

また、Mercedes4WD1つのアセンブリに、ファクトリを別のアセンブリに、コードを3番目に配置することもできます。その場合、ファクトリアセンブリはアセンブリのフレンドになりMercedes4WD、インスタンスを作成できますが、メインコードはそうではないため、作成できませんでした。 。これにより、インスタンスを作成できる範囲が狭くなりますが、すべてが少し複雑になります。

本当にあなたはいくつかのより多くの情報を提供する必要があります。後で人々が構築するのを止めたいと言うとき、あなたは同じコードベースで働いている他の開発者について話しているのですか?もしそうなら、あなたができることはそれほど多くありません。コンストラクターをチェックして、スタックの次のメソッドがファクトリのメソッドであるかどうかを確認し、そうでない場合は例外をスローできる場合がありますが、それが優れたアイデアかどうかはわかりません...

本当の問題は、なぜこれをしたいのかということです。

于 2010-05-10T08:29:48.157 に答える
1

クラスと同等のC++が本当に必要ですfriendが、C#にはクラスがありません。コンストラクターをいつでもプライベートにして、静的ファクトリメソッドをに追加できますMercedes4WD。これにより、「偶発的な」直接的な構築を防ぐことができます。

public class Mercedes4WD : ICar
{
    private Mercedes4WD()
    {
        // ...
    }

    public static Mercedes4WD Create()
    {
        return new Mercedes4WD();
    }
}

public abstract class CarFactory
{
    public abstract ICar CreateSUV();
}

public class MercedesFactory : CarFactory
{
    public override ICar CreateSUV()
    {
        return Mercedes4WD.Create();
    }
}
于 2010-05-10T08:30:55.997 に答える
0

クラスMercedes4WDのデフォルトのコンストラクターを内部として定義できます。したがって、デフォルトのコンストラクターは、タイプMercedes4WDが定義されているアセンブリ内でのみ呼び出すことができます。

于 2010-05-10T08:27:19.893 に答える
0

ファクトリメソッドの場合、コンストラクタをプライベートにしますが、実際にファクトリパターンを実装しているように見えます

于 2010-05-10T08:27:40.300 に答える
0

クラスを直接インスタンス化できないように、コンストラクターを内部に保持するか、インターフェイスを明示的に実装します。

于 2010-05-10T08:28:26.547 に答える
0

一般的な質問は、アセンブリ内のすべてのクラスでメソッドを使用可能にすることなく、クラスがメソッドを1つ以上の他のクラスで使用可能にする方法であるように思われます。直接コンストラクターをどのような形式でも公開するオブジェクトがないと仮定すると、静的デリゲートを使用して、探している効果を実現できます。

クラスFooが静的WozzleメソッドをクラスBarに公開したいが、他の誰も公開したくないとします。バーには、Foo.Wozzleを呼び出すために使用する静的デリゲートが必要です。BarがFoo.Wozzleを呼び出す必要があるが、デリゲートがまだ作成されていない場合は、Barだけが知っているタイプの新しいオブジェクト(「トークン」と呼びます)を作成し、静的メソッドFoo.BarRequestsWozzleに渡す必要があります。このメソッドは、Foo.Wozzleの静的デリゲートがまだ作成されていない場合は作成し、そのデリゲートを、渡されたトークンオブジェクトとともにBar.FooSuppliesWozzleに渡す必要があります。そのメソッドは、渡されたトークンのタイプがBarRequestsWozzleに与えられたものと一致するかどうかをチェックし、一致する場合は、デリゲートを適切に設定する必要があります。FooはWozzleメソッドをBar以外の誰にも与えません。Bar以外の誰も適切なトークンタイプを作成できません。Barはそうしません。

于 2011-07-22T20:42:29.710 に答える