又名生成器模式,是一種對象構建模式。設計模式
它能夠將複雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不一樣實現方法能夠構造出不一樣表現(屬性)的對象。mybatis
一步一步建立一個複雜的對象,它容許用戶只經過指定複雜對象的類型和內容就能夠構建它們,用戶不須要知道內部的具體構建細節。app
Product(產品角色): 一個具體的產品對象。post
Builder(抽象建造者): 建立一個Product對象的各個部件指定的抽象接口。ui
ConcreteBuilder(具體建造者): 實現抽象接口,構建和裝配各個部件。this
Director(指揮者)(若是簡單,能夠不要這個): 構建一個使用Builder接口的對象。它主要是用於建立一個複雜的對象。它主要有兩個做用,一是:隔離了客戶與對象的生產過程,二是:負責控制產品對象的生產過程。url
在mybatis初始化mapper映射文件的過程當中,爲<cache>節點建立Cache對象的方式就是構造者模式。其中CacheBilder爲建造者角色,Cache對象是產品角色。源碼以下:spa
//建造者類
public class CacheBuilder {
//下面的幾個字段就是產品Cache對象所需的屬性 private String id; private Class<? extends Cache> implementation; private List<Class<? extends Cache>> decorators; private Integer size; private Long clearInterval; private boolean readWrite; private Properties properties; public CacheBuilder(String id) { this.id = id; this.decorators = new ArrayList<Class<? extends Cache>>(); } //下面幾個方法就是建造者在生成產品對象時,須要使用的模板方法。根據方法的不一樣組合,能夠生成不一樣的Cache對象 public CacheBuilder implementation(Class<? extends Cache> implementation) { this.implementation = implementation; return this; } public CacheBuilder addDecorator(Class<? extends Cache> decorator) { if (decorator != null) { this.decorators.add(decorator); } return this; } public CacheBuilder size(Integer size) { this.size = size; return this; } public CacheBuilder clearInterval(Long clearInterval) { this.clearInterval = clearInterval; return this; } public CacheBuilder readWrite(boolean readWrite) { this.readWrite = readWrite; return this; } public CacheBuilder properties(Properties properties) { this.properties = properties; return this; } //這個方法就是建造者生成產品的具體方法,返回的Cahce對象就是產品對象 public Cache build() { setDefaultImplementations(); Cache cache = newBaseCacheInstance(implementation, id); setCacheProperties(cache); if (PerpetualCache.class.equals(cache.getClass())) { // issue #352, do not apply decorators to custom caches for (Class<? extends Cache> decorator : decorators) { cache = newCacheDecoratorInstance(decorator, cache); setCacheProperties(cache); } cache = setStandardDecorators(cache); } else if (!LoggingCache.class.isAssignableFrom(cache.getClass())) { cache = new LoggingCache(cache); } return cache; } private void setDefaultImplementations() { if (implementation == null) { implementation = PerpetualCache.class; if (decorators.size() == 0) { decorators.add(LruCache.class); } } } }
1) 客戶端沒必要知道產品內部組成的細節,將產品自己與產品的建立過程解耦,使得相同的建立過程能夠建立不一樣的產品對象。
2) 每個具體建造者都相對獨立,而與其餘的具體建造者無關,所以能夠很方便地替換具體建造者或增長新的具體建造者, 用戶使用不一樣的具體建造者便可獲得不一樣的產品對象 。
3) 能夠更加精細地控制產品的建立過程 。將複雜產品的建立步驟分解在不一樣的方法中,使得建立過程更加清晰,也更方便使用程序來控制建立過程。
4) 增長新的具體建造者無須修改原有類庫的代碼,指揮者類針對抽象建造者類編程,系統擴展方便,符合 「開閉原則」
1) 產品之間差別性很大的狀況: 建造者模式所建立的產品通常具備較多的共同點,其組成部分類似,若是產品之間的差別性很大,則不適合使用建造者模式,所以其使用範圍受到必定的限制。
2) 產品內部變化很複雜的狀況: 若是產品的內部變化複雜,可能會致使須要定義不少具體建造者類來實現這種變化,致使系統變得很龐大。
抽象工廠模式實現對產品家族的建立,一個產品家族是這樣的一系列產品:具備不一樣分類維度的產品組合,採用抽象工廠模式不須要關心構建過程,只關心什麼產品由什麼工廠生產便可。(注重整個產品族的生成)
建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是經過組裝零配件而產生一個新產品。甚至某些零配件都不須要。(注重組裝零配件,生成不一樣的產品對象)
相對於工廠模式會產出一個完整的產品,建造者應用於更加複雜的對象的構建,甚至只會構建產品的一個部分。