1、客户端只需要在一台主机上启动一个项目,所以使用单例模式,让用户无法重复启动程序。
2、单例模式的好处:唯一定位一个对象,容易拿到。
3、降低内存的消耗,节约内存资源,频繁创建和销毁对象单例模式会降低系统的性能。
缺点:没有抽象层,对单例类的扩展有困难。单例模式职责过重,担任了工厂角色,又充当了产品的角色。
Spring框架中的设计模式:
1、工厂设计模式:Spring使用工厂模式通过BeanFactory、ApllicationContext创建bean对象。
2、代理设计模式:SpringAOP功能实现。
3、单例设计模式:SpringBean默认是单例的,可以是Prototyle,SingleTon,request,session,globalsession作用域。多例、单例、每次http请求产生一个bean、每个session表示该针对每个http产生的bean、global全局httpsession。
4、模板方法设计模式:父类定义整体框架,包括调用什么方法,方法执行顺序。Spring中事务管理器AbstractPlatformTransactionManager就包含了多个模板方法,
比如提交事务,获取当前事务,在模板方法中按照一定顺序调用一些抽象方法,等待子类去实现,常见的子类DataSourceTransactionManager等。
小结:通过把不变行为搬移到超类,去除子类中的重复代码,通过模板方法模式把这些行为搬移到单一的地方,子类将父类的虚方法实现就行。·
5、观察者模式:Spring事件驱动模型就是观察中的一个应用
6、适配器模式:Spring AOP的增强和通知Advice使用的是适配器模式、spring MVC也是使用了适配器模式的Controller。
SpringMVC中DispatcherServlet通过HandlerAdapter处理器适配器调用具体的处理器。
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException { if (this.handlerAdapters != null) { //遍历所有的处理器适配器,找到支持处理当前handler的处理器适配器(HandlerAdapter是一个接口,其实返回的是一个实现HandlerAdapter的子类) for (HandlerAdapter adapter : this.handlerAdapters) { if (adapter.supports(handler)) { return adapter; } } } throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler"); }
通过适配器模式我们将所有的 controller 统一交给 HandlerAdapter 处理,免去了写大量的 if-else 语句对 Controller 进行判断,也更利于扩展新的 Controller 类型。
7、代理模式:SpringAoP主要实现有两种方式:1、JDK动态代理和2、Cglib动态代理
(1)、JDK动态代理只提供接口的代理,不支持类的代理,要求被代理类实现接口。(核心是InvocationHandler接口和Proxy类,动态创建目标类的代理对象,InvocationHandler通过invoke方法反射来调用目标代码,动态将横切逻辑和业务做在一起)
(2)、Cglib是通过直接继承被代理类,生成一个fastClass对象,进行动态代理。
源码中Spring可以判断是否被代理类是否实现了接口,如果实现了接口,就会使用jdk动态代理,否则使用动态打理Cglib。
小结:JDK的效率其实更高。默认是使用JDK动态代理。