Spark开发-Spark中的设计模式_创建型模式大类

辰令 2021-01-13 20:37:00
原文地址:https://www.cnblogs.com/ytwang/p/14262434.html

设计模式

原则: 单一职责 开闭  里氏代换  依赖倒转  接口隔离

创建型模式

这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。
这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。  
    原型模式     (Prototype Pattern)
    单例模式     (Singleton Pattern)
    工厂模式     (Factory Pattern)
    抽象工厂模式 (Abstract Factory Pattern)
    建造者模式   (Builder Pattern)
 说明:
    工厂模式: 简单工厂模式(静态方法模式) 工厂方法模式 
    抽象工厂模式

1.原型模式

 class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Serializable 

2.单例模式

  Spark中的 伴生对象就是属于单例模式

3.建造者模式

 SparkSession
 应用或使用:--使用场景 - 在客户端使用链式调用,一步一步的把对象构建出来
 val spark = SparkSession.builder()
  .appName("Common")
  .master("local[0]")
  .getOrCreate()

说明:

 Builder模式的好处之一是可以将对象的创建权交给Builder类,
  可将对象的配置传递和被创建对象隔离开,
  方便使用配置文件来配置创建对象,
SparkSession通过 SparkSession类,SparkSession静态类和Builder内部类实现了非常方便调用的接口,
  可以灵活根据参数和配置文件来创建SparkSession对象
  场景: 当一个类的构造函数参数超过4个,而且这些参数有些是可选的时,我们通常有两种办法来构建它的对象
  应用: 构建者解决复杂对象的构建问题
  作为对比常用: Javabean 模式

模式源码

   @InterfaceStability.Stable
   class SparkSession private(
       @transient val sparkContext: SparkContext,
       @transient private val existingSharedState: Option[SharedState],
       @transient private val parentSessionState: Option[SessionState],
       @transient private[sql] val extensions: SparkSessionExtensions)
     extends Serializable with Closeable with Logging {
 object SparkSession extends Logging {
  /**
   * Builder for [[SparkSession]].
   */
  @InterfaceStability.Stable
  class Builder extends Logging {

如何实现

     在 SparkSession 中创建一个静态内部类 Builder,然后将 SparkSession 中的参数都复制到Builder类中。
     在 SparkSession中创建一个private的构造函数,参数为Builder类型

     在Builder中创建一个public的构造函数,参数为Computer中必填的那些参数, 。
     在Builder中创建设置函数,对SparkSession中那些可选参数进行赋值,返回值为Builder类型的实例
     在Builder中创建一个build()方法,在其中构建Computer的实例并返回
        def builder(): Builder = new Builder

jdk中的建造者模式 Builder

  java.lang.StringBuilder 和 java.lang.StringBuffer
  StringBuilder和Stringbuffer 可以扩展原对象不同的字符串也可以按不同的顺序拼接
  java.lang.StringBuilder # append()
  java.lang.StringBuffer  # append()
    StringBuilder类 继承自 AbstractStringBuilder,而AbstractStringBuilder实现了 Appendable 接口。
                            AbstractStringBuilder 虽然是一个抽象类,但是它实现了 Appendable接口中的各个append()方法
  java.lang.Appendable 的所有实现类
   public interface Appendable{

4.工厂模式

Factory Pattern
  RowFactory  
  A factory class

参考:

  Builder模式实战2 (Spark/SparkSession)  https://www.cnblogs.com/arxobject/p/13670470.html
  Spark涉及的设计模式-创建型-原型模式 https://blog.csdn.net/sinat_35045195/article/details/107692251

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。