技术开发 频道

SCA软件架构设计理念分析

    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整体架构设计思想,敬请关注。共享是我的准则,共同提高是我的目标。

0
相关文章