最近在看《深入剖析Tomcat》一书,同时,正在按照这本书内容开发一个自己的servlet容器。阅读过程中,发现的Tomcat的设计模式有:
1.单例模式。
Tomcat的容器分为Wrapper,Conetxt,Host,Engine四种。其中,Wrapper对应每一个Servlet的容器,Context则对应于应用程序的容器。因此,每一个Wrapper只能与一个Servlet相关联。因此,Wrapper使用了单例模式来保证Servlet实例的唯一性。
2.观察者模式
为了实现启动或关闭父容器即可启动或关闭组件以及子容器,Tomcat设计出一个生命周期接口Lifecycle。Context,Wrapper,Pipeline均实现了这个接口。而这个接口中提供了addLifecycleListener,removeLifecycleListener等方法来实现对这些容器或者组件在发生状态变化时通知监听者。
3.变相的迭代组合模式
同样是Lifecycle生命周期,Tomcat在启动容器时会启动子容器和组件。例如,Context的start方法中,除了完成自己的初始化之外,还会调用同样实现了Lifecycle接口的子容器数组Container[] children和Pipeline的启动方法。
4.组合
例如,SimpleContext实现了Context,Lifecycle,Pipeline三个接口,但是,其实,这些接口的功能并不直接在SimpleContext本身的方法中实现,而是通过使用成员变量pipeline,以及lifecycle来完成相关方法的实现。实际上,Tomcat在设计时并没有使用层层继承的方式来完成各个具体功能的Context类,而是把行为,例如Lifecycle,Pipeline选择使用接口实现,也就是把行为抽象成接口,使用成员变量进行组合的方式来完成设计。这也体现了设计模式的多用组合少用继承的设计思想。
5.工厂模式
HttpConnector连接器的ServerSocketFactory工厂本身的得到就是通过工厂模式来得到。