在軟件系統中,有時候面臨着「一個複雜對象」的建立工做,其一般由各個部分的子對象用必定的算法構成;因爲需求的變化,這個複雜對象的各個部分常常面臨着劇烈的變化,可是將它們組合在一塊兒的算法確相對穩定。如何應對這種變化?如何提供一種「封裝機制」來隔離出「複雜對象的各個部分」的變化,從而保持系統中的「穩定構建算法」不隨着需求改變而改變?這就是要說的建造者模式。jquery
建造者模式能夠將一個複雜對象的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示。也就是說若是咱們用了建造者模式,那麼用戶就須要指定須要建造的類型就能夠獲得它們,而具體建造的過程和細節就不須要知道了。ajax
這個模式相對來講比較簡單,先上代碼,而後再解釋算法
function getBeerById(id, callback) { // 使用ID來請求數據,而後返回數據. asyncRequest('GET', 'beer.uri?id=' + id, function (resp) { // callback調用 response callback(resp.responseText); }); } var el = document.querySelector('#test'); el.addEventListener('click', getBeerByIdBridge, false); function getBeerByIdBridge(e) { getBeerById(this.id, function (beer) { console.log('Requested Beer: ' + beer); }); }
根據建造者的定義,表相便是回調,也就是說獲取數據之後如何顯示和處理取決於回調函數,相應地回調函數在處理數據的時候不須要關注是如何獲取數據的,一樣的例子也能夠在jquery的ajax方法裏看到,有不少回調函(好比success, error回調等),主要目的就是職責分離。async
一樣來一個jQuery的例子函數
$('<div class= "foo"> bar </div>');
咱們只須要傳入要生成的HTML字符,而不須要關係具體的HTML對象是如何生產的。this
建造者模式主要用於「分步驟構建一個複雜的對象」,在這其中「分步驟」是一個穩定的算法,而複雜對象的各個部分則常常變化,其優勢是:建造者模式的「加工工藝」是暴露的,這樣使得建造者模式更加靈活,而且建造者模式解耦了組裝過程和建立具體部件,使得咱們不用去關心每一個部件是如何組裝的。spa