У меня есть этот дизайн:
public interface IFactory<T> {
T Create();
T CreateWithSensibleDefaults();
}
public class AppleFactory : IFactory<Apple> { ... }
public class BananaFactory : IFactory<Banana> { ... }
// ...
Вымышленные Apple
и Banana
здесь не обязательно имеют общие типы (кроме, конечно, object
).
Я не хочу, чтобы клиенты зависели от конкретных фабрик, поэтому вместо этого вы можете просто запросить FactoryManager
для нового типа. У него есть FactoryForType
метод:
IFactory<T> FactoryForType<T>();
Теперь вы можете вызывать соответствующие методы интерфейса, например, FactoryForType<Apple>().Create()
. Пока все хорошо.
Но есть проблема на уровне реализации: как мне сохранить это отображение из типов в IFactory<T>
s? Наивный ответ - IDictionary<Type, IFactory<T>>
, но он не работает, поскольку на T
нет ковариации типов (я использую C # 3.5). Я просто застрял с IDictionary<Type, object>
и выполняю кастинг вручную?