建造者模式:將一複雜對象的表示與構建相分離,使得一樣的構建過程可建立不一樣的顯示。java
在建造者模式裏,有個指導者,由指導者來管理建造者,用戶是與指導者聯繫的,指導者聯繫建造者最後獲得產品。即建造模式能夠強制實行一種分步驟進行的建造過程。git
建造模式是將複雜的內部建立封裝在內部,對於外部調用的人來講,只須要傳入建造者和建造工具,對於內部是如何建形成成品的,調用者無需關心。github
舉個簡單的例子,如 人的身體各部位,人的生命週期,一年四季,汽車,有不少部件,車輪,方向盤,發動機還有各類小零件等等,部件不少,但遠不止這些,如何將這些部件裝配成一部汽車,這個裝配過程也很複雜(須要很好的組裝技術), builder模式就是爲了將部件和組裝分開。ide
package com.amosli.dp.build.builder; public abstract class Builder { public abstract void buildPartA(); public abstract void buildPartB(); public abstract Product getResult() ; }
package com.amosli.dp.build.builder; public class ConcreteBuilder extends Builder { private Product product = new Product(); public Product getResult() { return product; } @Override public void buildPartA() { product.add("part a.."); } @Override public void buildPartB() { product.add("part b.."); } }
package com.amosli.dp.build.builder; public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } public void construct() { builder.buildPartA(); builder.buildPartB(); } }
package com.amosli.dp.build.builder; import java.util.ArrayList; public class Product { ArrayList<String> product = new ArrayList<String>(); public void add(String part) { product.add(part); } }
package com.amosli.dp.build.builder; public class Client { public static void main(String[] args) { Builder builder = new ConcreteBuilder(); Director director = new Director(builder); director.construct(); Product product = builder.getResult(); System.out.println(product.product); } }
相同的方法,不一樣的執行順序,產生不一樣的事件結果時,能夠採用建造者模式。工具
多個部件或零件,均可以裝配到一個對象中,可是產生的運行結果又不相同時,則可使用該模式。ui
產品類很是複雜,或者產品類中的調用順序不一樣產生了不一樣的效能,這個時候使用建造者模式是很是合適。this
在對象建立過程當中會使用到系統中的一些其它對象,這些對象在產品對象的建立過程當中不易獲得時,也能夠採用建造者模式封裝該對象的建立過程。該種場景,只能是一個補償方法,由於一個對象不容易得到,而在設計階段居然沒有發覺,而要經過建立者模式柔化建立過程,自己已經違反設計最初目標。spa
使用建造者模式可使客戶端沒必要知道產品內部組成的細節設計
建造者獨立,不一樣builder,能夠構建成不一樣的顯示,相互獨立,提升了程序的可擴展性code
因爲具體的建造者是獨立的,所以能夠對建造過程逐步細化,而不對其餘的模塊產生任何影響
1.建造者模式所建立的產品通常具備較多的共同點,其組成部分類似,若是產品之間的差別性很大,則不適合使用建造者模式,所以其使用範圍受到必定的限制。
2.若是產品的內部變化複雜,可能會致使須要定義不少具體建造者類來實現這種變化,致使系統變得很龐大,可維護性將變差
本系列文章源碼地址,https://github.com/amosli/dp 歡迎Fork & Star !!