在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 extends E> elements) {
return (elements instanceof Collection)
? copyOf((Collection extends E>) 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
通过这个方法我们就能看出来,他创建了一个本身类的类型,然后把它返回,看一下所有的方法
这个也是一个典型的构造者模式,这里面的方法设置了很多东西,包括属性依赖,作用域等等,还有这个工厂方法
这个也是典型的builder模式,那mybatis里面也是有的,SqlSessionFactoryBuilder,我们之前讲过SqlSessionFactory
关于工厂模式,这里还有一个Builder,咱们看一下
build返回的都是SqlSessionFactoryBuilder,同时这里面还有一个XmlConfigBuilder,这个就是解析Mybatis的配置文件,
这里面的核心就是build方法,我们看看第一个
是一个Configuration配置,然后把配置传给默认的DefaultSqlSessionFactory,进行构造,而Configuration是怎么来的呢,
我们直接看这个方法,在return的时候直接调用了这个方法
这个就是我们说的,通过XMLConfiguBuilder,来解析XML文件,这个呢就是在建造者模式中,在使用建造者,
而这个parser是XMLConfigBuilder类型,然后调用它的parse方法,咱们来看一下
parse方法呢又调用parseConfiguration,我们进来看一下,这里面就非常清晰了
XNode根节点,他主要是负责各个组建的创建,装配,从上到下就是装配的流程,SqlSessionFactoryBuilder呢,
只不过做了一层简单的封装,把复杂的留在XMLConfigBuilder里面,用建造者包装一层建造者,这几个类就是Mybatis
关于建造者这个模式呢典型应用,所以在设计模式中,我们如何复合使用呢,其实可以参考一些开源框架的源码,这个呢
也是一个很好地选择方式,建造者模式在我们的日常工作中,使用的还是比较频繁,希望能理解透,并且能够应用到实际的
工作当中