私はこのデザインを持っています:
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へのこのマッピングをどのように保存するのですか?素朴な答えはですが、 (私はC#3.5を使用しています)にIDictionary<Type, IFactory<T>>型の共分散がないため、それは機能しません。T私はただで立ち往生してIDictionary<Type, object>いて、手動でキャストをしていますか?