Было бы лучше не заставлять класс быть одноэлементным по дизайну, а скорее быть одноэлементным по использованию. Пусть ваш объект доступа к данным (DAO) будет обычным классом. Реализуйте Service Locator , который действует как реестр объектов, и пусть это будет класс, который поддерживает особенность DAO.
Пример кода:
public interface INotesDao {
void Save (string s);
String Load ();
}
public class NotesDaoImpl : INotesDao {
// etc.
}
public interface IServiceLocator {
public TIntfc GetImpl<TIntfc> () {
return Activator.CreateInstance (m_Mapping[typeof(TIntfc)]);
}
}
public static class ServiceLocator {
public static IServiceLocator Instance { get; set; }
}
// this isn't a robust implementation, just meant to get the point across
public class MyAppServiceLocatorImpl : IServiceLocator {
private Dictionary<Type,Type> m_Mapping = new Dictionary<Type,Type> ();
private Dictionary<Type,Object> m_Cache = new Dictionary<Type,Object> ();
public MyServiceLocatorImpl () {
AddMapping<INotesDao, NotesDaoImpl> ();
}
private void AddMapping<TIntfc, TImpl> () {
m_Mapping[typeof(TIntfc)] = typeof(TImpl);
}
public TIntfc GetImpl<TIntfc> () {
var implType = m_Mapping[typeof(TIntfc)];
if (!m_Cache.ContainsKey (implType))
m_Cache[implType] = Activator.CreateInstance (implType);
return m_Cache[implType];
}
}
public class MyApp {
public MyApp () {
ServiceLocator.Instance = new MyAppServiceLocatorImpl ();
var dao = ServiceLocator.Instance.GetImpl<INotesDao> ();
var notes = dao.Load ();
// etc
}
}
Причина для реализации этого заключается в том, что одноэлементные классы сложнее правильно протестировать, не говоря уже о том, что это делает классы немного более сложными. Лучше всего, чтобы они были глупыми классами и позволяли другому классу специально управлять единичностью для всех типов классов.