建造者模式源码解析(jdk-guava+mybatis)
生活随笔
收集整理的這篇文章主要介紹了
建造者模式源码解析(jdk-guava+mybatis)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在JDK中是如何使用builder的呢,我們經常使用的一個類一定都用過,StringBuilder這么一個類,public final class StringBuilderextends AbstractStringBuilderimplements java.io.Serializable, CharSequence從他的類名就可以看出來它是一個Builder,而append方法我們是經常用的,我們看一下,@Overridepublic StringBuilder append(char[] str, int offset, int len) {super.append(str, offset, len);return this;}@Overridepublic StringBuilder append(boolean b) {super.append(b);return this;}@Overridepublic StringBuilder append(char c) {super.append(c);return this;}@Overridepublic StringBuilder append(int i) {super.append(i);return this;}@Overridepublic StringBuilder append(long lng) {super.append(lng);return this;}@Overridepublic StringBuilder append(float f) {super.append(f);return this;}@Overridepublic StringBuilder append(double d) {super.append(d);return this;}返回值this是他自己,這里面有很多重載,不同類型的append,最常用的可能是append的String類型,@Overridepublic StringBuilder append(Object obj) {return append(String.valueOf(obj));}@Overridepublic StringBuilder append(String str) {super.append(str);return this;}他這里首先調用了他父類的append方法,然后返回他自己,那StringBuffer也是同理,只不過StringBuffer里面增加了同步方法,我們看一下append方法,這里面的方法都加了同步的關鍵字,@Overridepublic synchronized StringBuffer append(Object obj) {toStringCache = null;super.append(String.valueOf(obj));return this;}@Overridepublic synchronized StringBuffer append(String str) {toStringCache = null;super.append(str);return this;}這里是JDK中非常非常標準的建造者格式,那在開源框架中有哪些呢,我們選擇ImmutableSet,我們看一下這里面的方法,本身它是一個不可變的set,包括里面的copyof,返回值也是我們選擇ImmutableSet,public static <E> ImmutableSet<E> copyOf(Iterable<? extends E> elements) {return (elements instanceof Collection)? copyOf((Collection<? extends E>) elements): copyOf(elements.iterator());}還有of方法返回的也是ImmutableSet,和add方法這個也比較標準,public static <E> ImmutableSet<E> of(E element) {return new SingletonImmutableSet<E>(element);
}@CanIgnoreReturnValue
@Override
public Builder<E> add(E element) {super.add(element);return this;
}這個Builder肯定存在一個build方法,@Overridepublic ImmutableSet<E> build() {ImmutableSet<E> 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關于建造者這個模式呢典型應用,所以在設計模式中,我們如何復合使用呢,其實可以參考一些開源框架的源碼,這個呢也是一個很好地選擇方式,建造者模式在我們的日常工作中,使用的還是比較頻繁,希望能理解透,并且能夠應用到實際的工作當中
?
總結
以上是生活随笔為你收集整理的建造者模式源码解析(jdk-guava+mybatis)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建造者模式 coding
- 下一篇: 单例模式讲解