建造者模式源码解析(jdk-guava+mybatis)

在JDK中是如何使用builder的呢,我们经常使用的一个类一定都用过,StringBuilder这么一个类,

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
	
从他的类名就可以看出来它是一个Builder,而append方法我们是经常用的,我们看一下,

    @Override
    public StringBuilder append(char[] str, int offset, int len) {
        super.append(str, offset, len);
        return this;
    }

    @Override
    public StringBuilder append(boolean b) {
        super.append(b);
        return this;
    }

    @Override
    public StringBuilder append(char c) {
        super.append(c);
        return this;
    }

    @Override
    public StringBuilder append(int i) {
        super.append(i);
        return this;
    }

    @Override
    public StringBuilder append(long lng) {
        super.append(lng);
        return this;
    }

    @Override
    public StringBuilder append(float f) {
        super.append(f);
        return this;
    }

    @Override
    public StringBuilder append(double d) {
        super.append(d);
        return this;
    }

返回值this是他自己,这里面有很多重载,不同类型的append,最常用的可能是append的String类型,

    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
	
他这里首先调用了他父类的append方法,然后返回他自己,那StringBuffer也是同理,只不过StringBuffer里面增加了同步方法,

我们看一下append方法,这里面的方法都加了同步的关键字,

    @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
	
这里是JDK中非常非常标准的建造者格式,那在开源框架中有哪些呢,我们选择ImmutableSet,我们看一下这里面的方法,

本身它是一个不可变的set,包括里面的copyof,返回值也是我们选择ImmutableSet,

  public static  ImmutableSet copyOf(Iterable elements) {
    return (elements instanceof Collection)
        ? copyOf((Collection) elements)
        : copyOf(elements.iterator());
  }
  
还有of方法返回的也是ImmutableSet,和add方法这个也比较标准,

public static  ImmutableSet of(E element) {
	return new SingletonImmutableSet(element);
}
  
@CanIgnoreReturnValue
@Override
public Builder add(E element) {
  super.add(element);
  return this;
}

这个Builder肯定存在一个build方法,

    @Override
    public ImmutableSet build() {
      ImmutableSet result = construct(size, contents);
      // construct has the side effect of deduping contents, so we update size
      // accordingly.
      size = result.size();
      return result;
    }
	
这段代码像不像我们写的第二个版本,有一个build方法,当我们使用ImmutableSet的时候呢,我们可以add,最后调用一下build方法,

就可以了,我们来看一下Spring的BeanDefinitionBuilder

建造者模式源码解析(jdk-guava+mybatis)_第1张图片

通过这个方法我们就能看出来,他创建了一个本身类的类型,然后把它返回,看一下所有的方法

建造者模式源码解析(jdk-guava+mybatis)_第2张图片

这个也是一个典型的构造者模式,这里面的方法设置了很多东西,包括属性依赖,作用域等等,还有这个工厂方法

建造者模式源码解析(jdk-guava+mybatis)_第3张图片

这个也是典型的builder模式,那mybatis里面也是有的,SqlSessionFactoryBuilder,我们之前讲过SqlSessionFactory

关于工厂模式,这里还有一个Builder,咱们看一下

建造者模式源码解析(jdk-guava+mybatis)_第4张图片

build返回的都是SqlSessionFactoryBuilder,同时这里面还有一个XmlConfigBuilder,这个就是解析Mybatis的配置文件,

这里面的核心就是build方法,我们看看第一个

建造者模式源码解析(jdk-guava+mybatis)_第5张图片

是一个Configuration配置,然后把配置传给默认的DefaultSqlSessionFactory,进行构造,而Configuration是怎么来的呢,

我们直接看这个方法,在return的时候直接调用了这个方法

建造者模式源码解析(jdk-guava+mybatis)_第6张图片

这个就是我们说的,通过XMLConfiguBuilder,来解析XML文件,这个呢就是在建造者模式中,在使用建造者,

而这个parser是XMLConfigBuilder类型,然后调用它的parse方法,咱们来看一下

建造者模式源码解析(jdk-guava+mybatis)_第7张图片

parse方法呢又调用parseConfiguration,我们进来看一下,这里面就非常清晰了

建造者模式源码解析(jdk-guava+mybatis)_第8张图片

XNode根节点,他主要是负责各个组建的创建,装配,从上到下就是装配的流程,SqlSessionFactoryBuilder呢,

只不过做了一层简单的封装,把复杂的留在XMLConfigBuilder里面,用建造者包装一层建造者,这几个类就是Mybatis

关于建造者这个模式呢典型应用,所以在设计模式中,我们如何复合使用呢,其实可以参考一些开源框架的源码,这个呢

也是一个很好地选择方式,建造者模式在我们的日常工作中,使用的还是比较频繁,希望能理解透,并且能够应用到实际的

工作当中

 

你可能感兴趣的:(建造者模式)