蓋房項目需求
1) 須要建房子:這一過程爲打樁、砌牆、封頂
2) 房子有各類各樣的,好比普通房,高樓,別墅,各類房子的過程雖然同樣,可是要求不要相同的.
3) 請編寫程序,完成需求.java
傳統方式解決蓋房需求
一、分析編程
二、代碼緩存
public abstract class AbstractHouse { //打地基 public abstract void buildBasic(); //砌牆 public abstract void buildWalls(); //封頂 public abstract void roofed(); public void build() { buildBasic(); buildWalls(); roofed(); } } public class CommonHouse extends AbstractHouse { @Override public void buildBasic() { // TODO Auto-generated method stub System.out.println(" 普通房子打地基 "); } @Override public void buildWalls() { // TODO Auto-generated method stub System.out.println(" 普通房子砌牆 "); } @Override public void roofed() { // TODO Auto-generated method stub System.out.println(" 普通房子封頂 "); } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub CommonHouse commonHouse = new CommonHouse(); commonHouse.build(); } }
傳統方式解決蓋房需求問題分析app
1) 優勢是比較好理解,簡單易操做。ide
2) 設計的程序結構,過於簡單,沒有設計緩存層對象,程序的擴展和維護很差. 也就是說,這種設計方案,把產品(即:房子) 和 建立產品的過程(即:建房子流程) 封裝在一塊兒,耦合性加強了。源碼分析
3) 解決方案:將產品和產品建造過程解耦 => 建造者模式.ui
建造者模式基本介紹this
基本介紹spa
1) 建造者模式(Builder Pattern) 又叫生成器模式,是一種對象構建模式。它能夠將複雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不一樣實現方法能夠構造出不一樣表現(屬性)的對象。(抽象出來的是建造者,以前一直以爲把產品抽象出來。後面代碼會有體現)設計
2) 建造者模式 是一步一步建立一個複雜的對象,它容許用戶只經過指定複雜對象的類型和內容就能夠構建它們,用戶不須要知道內部的具體構建細節。
建造者模式的四個角色
1) Product(產品角色): 一個具體的產品對象。
2) Builder(抽象建造者): 建立一個Product對象的各個部件指定的 接口/抽象類。
3) ConcreteBuilder(具體建造者): 實現接口,構建和裝配各個部件。
4) Director(指揮者): 構建一個使用Builder接口的對象。它主要是用於建立一個複雜的對象。它主要有兩個做用,一是:隔離了客戶與對象的生產過程,二是:負責控制產品對象的生產過程。
建造者模式原理類圖
建造者模式解決蓋房需求應用實例
1) 須要建房子:這一過程爲打樁、砌牆、封頂。不論是普通房子也好,別墅也好都須要經歷這些過程,下面咱們使用建造者模式(Builder Pattern)來完成
2) 思路分析圖解(類圖)
3) 代碼實現
//產品->Product public class House { private String baise; private String wall; private String roofed; public String getBaise() { return baise; } public void setBaise(String baise) { this.baise = baise; } public String getWall() { return wall; } public void setWall(String wall) { this.wall = wall; } public String getRoofed() { return roofed; } public void setRoofed(String roofed) { this.roofed = roofed; } } // 抽象的建造者 public abstract class HouseBuilder { protected House house = new House(); //將建造的流程寫好, 抽象的方法 public abstract void buildBasic(); public abstract void buildWalls(); public abstract void roofed(); //建造房子好, 將產品(房子) 返回 public House buildHouse() { return house; } } //具體的建造者1 public class HighBuilding extends HouseBuilder { @Override public void buildBasic() { // TODO Auto-generated method stub System.out.println(" 高樓的打地基100米 "); } @Override public void buildWalls() { // TODO Auto-generated method stub System.out.println(" 高樓的砌牆20cm "); } @Override public void roofed() { // TODO Auto-generated method stub System.out.println(" 高樓的透明屋頂 "); } } //具體的建造者2 public class CommonHouse extends HouseBuilder { @Override public void buildBasic() { // TODO Auto-generated method stub System.out.println(" 普通房子打地基5米 "); } @Override public void buildWalls() { // TODO Auto-generated method stub System.out.println(" 普通房子砌牆10cm "); } @Override public void roofed() { // TODO Auto-generated method stub System.out.println(" 普通房子屋頂 "); } } //指揮者,這裏去指定製做流程,返回產品 public class HouseDirector { HouseBuilder houseBuilder = null; //構造器傳入 houseBuilder public HouseDirector(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //經過setter 傳入 houseBuilder public void setHouseBuilder(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //如何處理建造房子的流程,交給指揮者 public House constructHouse() { houseBuilder.buildBasic(); houseBuilder.buildWalls(); houseBuilder.roofed(); return houseBuilder.buildHouse(); } } public class Client { public static void main(String[] args) { //蓋普通房子 CommonHouse commonHouse = new CommonHouse(); //準備建立房子的指揮者 HouseDirector houseDirector = new HouseDirector(commonHouse); //完成蓋房子,返回產品(普通房子) House house = houseDirector.constructHouse(); //System.out.println("輸出流程"); System.out.println("--------------------------"); //蓋高樓 HighBuilding highBuilding = new HighBuilding(); //重置建造者 houseDirector.setHouseBuilder(highBuilding); //完成蓋房子,返回產品(高樓) houseDirector.constructHouse(); } }
建造者模式在JDK的應用和源碼分析
1) java.lang.StringBuilder中的建造者模式
2) 代碼說明+Debug源碼
建造者模式在JDK的應用和源碼分析
3) 源碼中建造者模式角色分析
Appendable 接口定義了多個 append 方法(抽象方法), 即 Appendable 爲抽象建造者, 定義了抽象方法
AbstractStringBuilder 實現了 Appendable 接口方法,這裏的 AbstractStringBuilder 已是建造者,只是不能實例化
StringBuilder 即充當了指揮者角色,同時充當了具體的建造者,建造方法的實現是由 AbstractStringBuilder 完成, 而StringBuilder 繼承了 AbstractStringBuilder
建造者模式的注意事項和細節
1) 客戶端(使用程序)沒必要知道產品內部組成的細節,將產品自己與產品的建立過程解耦,使得相同的建立過程能夠建立不一樣的產品對象
2) 每個具體建造者都相對獨立,而與其餘的具體建造者無關,所以能夠很方便地替換具體建造者或增長新的具體建造者, 用戶使用不一樣的具體建造者便可獲得不一樣的產品對象
3) 能夠更加精細地控制產品的建立過程 。將複雜產品的建立步驟分解在不一樣的方法中,使得建立過程更加清晰,也更方便使用程序來控制建立過程
4) 增長新的具體建造者無須修改原有類庫的代碼,指揮者類針對抽象建造者類編程,系統擴展方便,符合 「開閉原則」
5) 建造者模式所建立的產品通常具備較多的共同點,其組成部分類似,若是產品之間的差別性很大,則不適合使用建造者模式,所以其使用範圍受到必定的限制。
6) 若是產品的內部變化複雜,可能會致使須要定義不少具體建造者類來實現這種變化,致使系統變得很龐大,所以在這種狀況下,要考慮是否選擇建造者模式.
7) 抽象工廠模式VS建造者模式抽象工廠模式實現對產品家族的建立,一個產品家族是這樣的一系列產品:具備不一樣分類維度的產品組合,採用抽象工廠模式不須要關心構建過程,只關心什麼產品由什麼工廠生產便可。而建造者模式則是要求按照指定的藍圖建造產品,它的主要目的是經過組裝零配件而產生一個新產品