Tuscany中工厂设计中涉及泛型的应用
根据我们上面介绍的泛型的基础知识,下面让我们来看看SpringImplementationProviderFactory如何定义的,其中使用了泛型约束SpringImplementation。
public class SpringImplementationProviderFactory
implements ImplementationProviderFactory<SpringImplementation>
SpringImplementationProviderFactory另外其中有个方法非常值得注意,就是getModelType,在这儿是SpringImplementation.class。
public Class<SpringImplementation> getModelType() {
return SpringImplementation.class;
}
类似的我们看ResourceImplementationProviderFactory的定义,其中使用了泛型约束ResourceImplementation。
public class ResourceImplementationProviderFactory implements
ImplementationProviderFactory<ResourceImplementation>
它同样有个方法getModelType,在这儿是ResourceImplementation.class。
public Class<ResourceImplementation> getModelType() {
return ResourceImplementation.class;
}
那么,这个ModeType有什么神秘的用途呢?来看DefaultProviderFactoryExtensionPoint的代码,从以下代码可以看出,在HashMap中的key值为providerFactory.getModelType(),到这儿明白了ModelType的用途了吧!
private final Map<Class<?>, ProviderFactory> providerFactories = new HashMap<Class<?>,
ProviderFactory>();
public void addProviderFactory(ProviderFactory providerFactory) {
providerFactories.put(providerFactory.getModelType(), providerFactory);
}
下面是META-INF/services/ org.apache.tuscany.sca.provide.ImplementationProviderFactory的片断,从中也可以找到model的身影,从而可以看出model泛型约束是贯穿全剧的线索。
org.apache.tuscany.sca.implementation.spring.SpringImplementationProviderFactory;
model=org.apache.tuscany.sca.implementation.spring.SpringImplementation
在Tuscany的工厂设计中都使用了类似的设计理念,使用要创建的类或者是类的接口作为其工厂HashMap中的Key,这样就能很方便地取出这个工厂,创建这个类了。从DefaultProviderFactoryExtensionPoint中的获取工厂可以看出这一点,接口或实现类都可以作为key保存到HashMap中。
public ProviderFactory getProviderFactory(Class<?> modelType) {
loadProviderFactories();
Class<?>[] classes = modelType.getInterfaces();
for (Class<?> c : classes) {
ProviderFactory factory = providerFactories.get(c);
if (factory != null) {
return factory;
}
}
return providerFactories.get(modelType);
}
4、结束语
以上内容仅仅涉及插件式设计模式及工厂模式的深化和发展,随后将介绍有关Proxy及invocation方面的设计理念,还有Assembly,contribute和binding的具体设计思想,最后介绍Tuscany整体架构设计思想,敬请关注。共享是我的准则,共同提高是我的目标。