次のコードを検討してください
class SqlInstance
{
private SqlInstance()
{
}
public void Connect(string username, string password)
{
//connect
}
public void Disconnect()
{
//disconnect
}
//This method is not a singleton. Its one instance per key
public static SqlInstance GetInstance(string key)
{
return new SqlInstance();
}
}
class FileInstance
{
private FileInstance()
{
}
//no this is not a mistake. This connect has no parameters
private void Connect()
{
//connect
}
public void Disconnect()
{
//disconnect
}
//This method is not a singleton. Its one instance per key
public static FileInstance GetInstance(string key)
{
return new FileInstance();
}
}
class DataManager
{
SqlInstance GetSqlChannelInstance()
{
//if some logic
return SqlInstance.GetInstance("dev.1");
//if some other logic
return SqlInstance.GetInstance("dev.2");
//...and so on
}
FileInstance GetFileInstance()
{
//if some logic
return FileInstance.GetInstance("fil.1");
//if some other logic
return FileInstance.GetInstance("fil.2");
//...and so on
}
}
DataManagerは、呼び出し元がSqlInstanceまたはFileInstanceのインスタンスを取得するために使用する必要があるラッパー スタイル クラスです。ここでの問題は、DataManger クラスを経由する代わりに、呼び出し元がクラスの GetInstance メソッドを直接呼び出すことができることです。この問題をどのように解決しますか?具体的には、呼び出し元がDataManagerを通過することを強制するパターンまたはメカニズムはありますか? 2 つのインスタンスクラスをDataManagerクラスだけに「見える」ようにすることは可能ですか。
2 つのクラスをDataManagerクラスの内部クラスにすることが問題の解決に役立つことはわかっていますが、これを行うための「より良い」方法が他にあるかどうか知りたいですか?
PS: クラス名と実装は無視してください。これは単なる例であり、実際のコードから取られたものではありません。
言語はC#