まず第一に、記事でこれを読みました-これは基本的に、シングルトンをまったく使用すべきではないことを示しています-
ほとんどの場合、シングルトンはインスタンスの作成時にパラメーターを指定することを許可しません。そうしないと、インスタンスの 2 番目の要求が別のパラメーターで行われると問題が発生する可能性があります。(同じパラメーターを持つすべてのリクエストに対して同じインスタンスにアクセスする必要がある場合は、ファクトリ パターンの方が適切です。)
パラメータと同じパラメータを持つ同じインスタンスが必要なので、ファクトリ パターンが必要であると結論付けました。
しかし、良いファクトリ パターンの実装をどこにも見つけることができませんでした。
パラメーターを使用した適切な c# シングルトン ファクトリ パターンの実装が見つかった場合は、親切に教えてください。
わかりました、ここで非常に具体的にしようと思います...これが私の状況を説明することを願っています.
代替方法は大歓迎です。多くの実装を組み合わせただけです - 私の理解は外れているかもしれません。
だから私はクラス'A'を持っています。データベースに接続するために使用されるクラスです - データベース接続。
接続には 4 つのパラメーターが必要で、制約は次のとおりです。
複数の接続を可能にする必要があります-異なるデータベースで(パラメーターが異なります)
特定の接続のインスタンスが1つだけ必要です-同じパラメーターを持つシングルトン(私の理解では)
上記の記事に従って、工場モデルが必要であり、接続数を制限したり、タイムアウト後に接続を閉じたりすることもできます。
これに基づいて、パラメータ/引数を持つシングルトンファクトリが必要です...私は仮定します
クラスAは次のようになります
<which access modifier ?> Class A {
private Class A(string hostname, string port, string username, string pw_hash) {
//create a new instance with the specified parameters
}
//other methods on the connection
protected void close() {
//close the connection
}
}
public class AFactory//should it inherit class A?? {
private IList<A> connections = new List<A>();
private AFactory()
{
//do something
}
private static readonly Lazy<AFactory> lazy
= new Lazy<AFactory>(() => new AFactory());
public static AFactory Instance { get { return lazy.Value; } }
public A getA(string hostname, string service, string username, string pw_hash)
{
foreach (A a in A)
{
if (a.hostname == hostname && a.service == service && a.username == username)
return a;
}
A d = new A(hostname, service, username, pw_hash);
connections.Add(d);
return d;
}
これは、クラス A のコンストラクターがパブリックである限り、うまく機能しますが、シングルトンの目的に反します。このコードを機能させるにはどうすればよいですか。
指定されたパラメータに対してクラス A のインスタンスが 1 つだけ必要です。
ありがとう
インドラジット