Question

J'ai cette conception:

public interface IFactory<T> {
  T Create();
  T CreateWithSensibleDefaults();
}

public class AppleFactory : IFactory<Apple> { ... }
public class BananaFactory : IFactory<Banana> { ... }
// ...

La Apple fictive et Banana ici ne partagent pas nécessairement tous les types communs (autres que object, bien sûr).

Je ne veux pas que les clients d'avoir à dépendre des usines spécifiques, donc au lieu, vous pouvez simplement demander à un FactoryManager pour un nouveau type. Il a une méthode FactoryForType:

IFactory<T> FactoryForType<T>();

Maintenant, vous pouvez appeler les méthodes d'interface appropriées avec quelque chose comme FactoryForType<Apple>().Create(). Jusqu'à présent, si bon.

Mais il y a un problème au niveau de la mise en œuvre: comment puis-je stocker cette correspondance entre les types de IFactory<T>s? La réponse naïve est un IDictionary<Type, IFactory<T>>, mais cela ne fonctionne pas car il n'y a pas de covariance de type sur le T (j'utilise C # 3.5). Suis-je juste coincé avec un IDictionary<Type, object> et de faire la coulée manuellement?

Était-ce utile?

La solution

Malheureusement, oui, vous êtes coincé avec la coulée manuelle. Cependant, cette coulée peut être un détail de mise en œuvre et non vu par le consommateur. Par exemple

public class FactoryMap { 
  private Dictionary<Type,object> _map = new Dictionary<Type,object>();
  public void Add<T>(IFactory<T> factory) {
    _map[typeof(T)] = factory;
  }
  public IFactory<T> Get<T>() {
    return (IFactory<T>)_map[typeof(T)];
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top