15-设计模式总结
Spring Boot 设计模式总结概述Spring Boot 在设计和实现过程中大量运用了经典的设计模式,这些模式使得框架具有高度的可扩展性、可维护性和灵活性。本文将系统总结 Spring Boot 中使用的主要设计模式。一、创建型模式1.1 工厂模式(Factory Pattern)应用场景Spring Boot 使用工厂模式创建不同类型的对象,根据条件动态决定创建哪种具体实现。代码示例// ApplicationContextFactory - 根据Web类型创建不同的应用上下文@FunctionalInterfacepublicinterfaceApplicationContextFactory{ConfigurableApplicationContextapply(WebApplicationTypewebApplicationType);ApplicationContextFactoryDEFAULT=(webApplicationType)-{try{returnswitch(webApplicationType){caseSERVLET-newAnnotationConfigServletWebServerApplicationContext();caseREACTIVE-newAnnotationConfigReactiveWebServerApplicationContext();default-newAnnotationConfigApplicationContext();};}catch(Exceptionex){thrownewIllegalStateException(...);}};}// WebServerFactory - 创建不同的嵌入式容器publicinterfaceWebServerFactory{WebServergetWebServer(ServletContextInitializer...initializers);}publicclassTomcatServletWebServerFactoryimplementsWebServerFactory{@OverridepublicWebServergetWebServer(ServletContextInitializer...initializers){Tomcattomcat=newTomcat();// 配置TomcatreturnnewTomcatWebServer(tomcat);}}优点解耦: 将对象创建与使用分离扩展性: 易于添加新的产品类型统一接口: 通过统一接口创建对象缺点增加系统复杂度需要额外的工厂类1.2 建造者模式(Builder Pattern)应用场景用于构建复杂的配置对象,如 SpringApplication、各种 Properties 对象等。代码示例// SpringApplicationBuilderpublicclassSpringApplicationBuilder{privatefinalSpringApplicationapplication;privateConfigurableApplicationContextcontext;publicSpringApplicationBuilder(Class?...sources){this.application=newSpringApplication(sources);}publicSpringApplicationBuilderbannerMode(Banner.ModebannerMode){this.application.setBannerMode(bannerMode);returnthis;}publicSpringApplicationBuilderweb(WebApplicationTypewebApplicationType){this.application.setWebApplicationType(webApplicationType);returnthis;}publicSpringApplicationBuilderprofiles(String...profiles){this.application.setAdditionalProfiles(profiles);returnthis;}publicSpringApplicationBuilderproperties(String...defaultProperties){this.application.setDefaultProperties(...);returnthis;}publicConfigurableApplicationContextrun(String...args){this.context=this.application.run(args);returnthis.context;}}// 使用示例newSpringApplicationBuilder(MyApplication.class).bannerMode(Banner.Mode.OFF).web(WebApplicationType.SERVLET).profiles("prod").properties("server.port=8080").run(args);优点链式调用: 代码可读性强可选参数: 灵活设置配置项不可变性: 可以创建不可变对象1.3 单例模式(Singleton Pattern)应用场景Spring 容器中的 Bean 默认就是单例模式,Spring Boot 中也广泛使用。代码示例// SpringApplicationShutdownHook - 单例实现publicfinalclassSpringApplicationShutdownHookimplementsRunnable{// 静态内部类实现懒加载单例privatestaticclassHook{privatestaticfinalSpringApplicationShutdownHookINSTANCE=newSpringApplicationShutdownHook();}publicstaticSpringApplicationShutdownHookgetInstance(){returnHook.INSTANCE;}privateSpringApplicationShutdownHook(){// 私有构造函数}}// 枚举单例(最安全的实现)publicenumApplicationStartup{DEFAULT;publicvoidstart(Stringname){// ...}}优点节省资源: 只有一个实例全局访问: 方便共享状态线程安全: 可以控制并发访问二、结构型模式2.1 外观模式(Facade Pattern)应用场景Starter 机制就是外观模式的典型应用,将复杂的依赖关系和配置封装起来。代码示例// spring-boot-starter-web 作为一个外观// 内部包含:// - spring-boot-starter// - spring-boot-starter-json// - spring-boot-starter-tomcat// - spring-webmvc// 用户只需要引入一个依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web