首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

ActiveMQ 源码学习 一:从源码中找寻设计模式的踪影

2013-08-16 
ActiveMQ 源码学习 1:从源码中找寻设计模式的踪影?BrokerFactory 的主要功能是根据 URI(指向某个配置文件)

ActiveMQ 源码学习 1:从源码中找寻设计模式的踪影

?

BrokerFactory 的主要功能是根据 URI(指向某个配置文件)创建 BrokerService 实例,URI 的语法决定了所创建的 broker service 的具体类型,如 createBroker 方法实现中所示。

?

来回顾一下抽象工厂模式的结构。

抽象工厂模式包含两种类的继承层次关系。抽象工厂(abstract factory)和具体工厂(concret factory)组成的工厂类继承关系,以及由抽象产品(abstract product)和具体产品(concret product)组成的产品类继承关系。

?

在 BrokerFactory 中,由于其主要功能是要创建 broker service 实例,因而套用在抽象工厂模式下,BrokerService 就充当了模式中的抽象产品类,而 BrokerService 的子类,如 XBeanBrokerService 等,则扮演了具体产品的角色。

?

有了产品类继承关系,接下来的问题是,BrokerFactory 是否是作为抽象工厂模式中的抽象工厂类存在的呢?

?

继续看 createBroker 方法的实现,会发现 BrokerFactory 将 broker service 的创建转移给了某个 BrokerFactoryHandler 的实例,该实例是通过 createBrokerFactoryHandler 方法得到的。

?

?

createBrokerFactoryHandler 方法根据参数的值创建不同种类的 BrokerFactoryHandler 实例。而 BrokerFactoryHandler 被定义为接口类,它只提供了一个接口方法 createBroker,其作用也是用于创建 broker service 实例,因而它才是真正的 broker service 的抽象工厂。继续分析发现,BrokerFactoryHandler 的实现类中包含 XBeanBrokerFactoryHandler,因而可以肯定 BrokerFactoryHandler 及其实现类构成了抽象工厂模式中的工厂类继承层次关系。

?

接下来,我们来看另一个更有意思的工具类?FactoryFinder?的实现。在这个类的实现中会看到另一种设计模式的应用,以及有关多线程的考虑。

?

?

Class clazz = classMap.get(path);    if (clazz == null) {        clazz = loadClass(loadProperties(path));        Class ret = classMap.putIfAbsent(path, clazz);        if (ret != null)            clazz = ret;    }    return clazz.newInstance();

?

用 ConcurrentHashMap 的 putIfAbsent 往 Map 中放 Key-Value,并根据返回值判断原来的 Map 中是否已经存在该 Key-Value 对。

?

完。

?

** 这篇文章属于原创,最早在7月28号发布在?Wordpress,转到这里算是对今天阅读的一篇文章(Why I Love Reading Other People’s Code And You Should Too?)的响应。很长一段时间以来,我都不满意 iteye 的排版,加之这篇文字最早是使用 markdown 语法写的,而我发现 wordpress 对 markdown 文件转成的 html 的支持很赞(几乎可以直接复制粘贴,效果见前面的 wordpress 链接),所以并没有发到这里。直到最近逐渐习惯了 iteye 的排版之后,决定把之前在 wordpress 上的文章贴过来,便于一处维护,也便于与大家分享和讨论问题:-) 1 楼 hunan_java 11 分钟前   http://gotomao.com 上线了,在线免费视频,在线API文档,无广告,给技术屌丝带来福音了~~~

热点排行