我的Scala应用采用哪种设计模式?Spark+Kafka场景分析
分析你的Scala Spark代码对应的设计模式
Great question! Let's break down what's going on in your code and map it to common design patterns:
首先,这不是Cake Pattern
Cake Pattern是Scala中一种通过trait混入来实现依赖注入的方式,核心是将不同的依赖封装成独立trait,然后在具体类中混入这些trait来组合依赖。你的代码是基于trait的继承和方法复用,并没有通过混入多个trait来组合依赖,所以不属于Cake Pattern。
核心模式:Template Method(模板方法模式)
这是代码最明显的设计模式:
- 父trait
SparkApplication定义了一个算法骨架:withSparkContext方法封装了创建SparkContext的完整流程——初始化配置、创建上下文、执行传入的业务逻辑。其中sparkConfig是抽象方法,留给子类去实现(这是模板方法中的“钩子方法”,让子类可以自定义部分步骤)。 - 子trait
SparkStreamingApplication继承自SparkApplication,复用了父类创建SparkContext的逻辑,同时扩展出了Spark Streaming的专属流程:创建StreamingContext、设置checkpoint、启动流、等待终止。它并没有改变父类的核心流程,只是在其基础上添加了额外步骤,完全符合模板方法“父类定流程,子类扩细节”的特点。
附带的轻量级设计:Strategy Pattern(策略模式)+ 轻量级依赖注入
你代码中的f参数(比如SparkContext => Unit或(SparkContext, StreamingContext) => Unit)是典型的策略模式应用:
withSparkContext和withSparkStreamingContext负责资源的创建、管理和销毁(固定流程),而具体的业务逻辑(比如处理Kafka数据流)作为“策略”传入方法中。- 这种通过函数参数传递业务逻辑的方式,也可以看作是一种轻量级的依赖注入——你把业务逻辑(依赖)注入到方法中,让方法专注于资源管理,实现了业务逻辑和基础设施代码的解耦。不过这不是传统意义上的依赖注入(比如构造器注入、Setter注入),而是更函数式的实现方式。
总结
你的代码主要应用了Template Method Pattern来复用和扩展Spark上下文的创建流程,同时结合Strategy Pattern(通过函数参数注入业务逻辑)实现了业务与基础设施的解耦。它既不是Cake Pattern,也不是传统的依赖注入模式,而是函数式风格下模板方法和策略模式的结合。
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

