Тот факт, что задействованы статические члены, заставляет меня думать, что подход на основе словаря является лучшим, если только вы не захотите вызвать рефлексию и выяснить метод получения одиночного файла. Это рабочий пример кода, который я смог придумать:
// Added another interface - GetInstance
public interface IManager
{
object GetObject(int i);
}
// made BaseManager abstract; you don't have to do that, but then
// remember to make everything virtual, etc etc.
public abstract class BaseManager : IManager
{
public abstract object GetObject(int i);
}
Каждый из дочерних классов реализует статический конструктор для создания экземпляра синглтона в моем примере, который слишком упрощен, но я уверен, что у вас есть лучший способ сделать это:
public class XManager : BaseManager
{
public static XManager Instance;
static XManager() { Instance = new XManager(); }
public override object GetObject(int i)
{
return "XManager Instance: index was " + i.ToString();
}
}
public class YManager : BaseManager
{
public static YManager Instance;
static XManager() { Instance = new YManager(); }
public override object GetObject(int i)
{
return "YManager Instance: index was " + i.ToString();
}
}
ManagerFacade реализует словарь следующим образом:
public static class ManagerFacade
{
private static readonly Dictionary<Type, IManager> managerInstances
= new Dictionary<Type, IManager>()
{
{typeof(XManager), XManager.Instance},
{typeof(YManager), YManager.Instance}
};
private static IManager GetManager<T>() where T: IManager
{
return managerInstances[typeof(T)];
}
public static object GetObject<T>(int i) where T: IManager
{
return GetManager<T>().GetObject(i);
}
}
Консольное приложение для проверки фасада менеджера:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(ManagerFacade.GetObject<XManager>(2).ToString());
Console.WriteLine(ManagerFacade.GetObject<YManager>(4).ToString());
// pause program execution to review results...
Console.WriteLine("Press enter to exit");
Console.ReadLine();
}
}
Вывод на консоль:
XManager Instance: index was 2
YManager Instance: index was 4
Press enter to exit
Я уверен, что есть более изящные способы сделать это, но я просто хотел показать, как настроить и получить доступ к словарю для поддержки синглетонов.