2010-05-19 95 views
4

我有这样的设计:如何使这个简单的C#泛型工厂工作?

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

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

虚构AppleBanana这里不一定有任何常见的类型(比object等,当然)。

我不希望客户必须依赖特定的工厂,所以您可以只需要询问FactoryManager以获取新的类型。它有一个FactoryForType方法:

IFactory<T> FactoryForType<T>(); 

现在你可以像FactoryForType<Apple>().Create()调用适当的接口方法。到现在为止还挺好。

但是在执行级别存在一个问题:如何将此映射从类型存储到IFactory<T> s?天真的答案是IDictionary<Type, IFactory<T>>,但这不起作用,因为T(我使用C#3.5)没有类型协方差。我只是坚持IDictionary<Type, object>并手动进行铸造?

回答

5

不幸的是,你被困在手工铸造。然而,这种投射可以是实现细节并且不被消费者看到。例如

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)]; 
    } 
} 
+0

@code诗人,26秒:) – JaredPar 2010-05-19 16:01:50

+0

谢谢!这是关于我现在的;我觉得没有太多的摆动空间可以使用协变。 – 2010-05-19 16:05:57