概念:ide
建造模式是對象的建立模式,建造模式能夠將一個產品的內部表象(我的理解,能夠稱爲組件)與產品的生產分割開來,從而可使一個建造過程生產出來具備不一樣內部表象的產品對象。ui
概念:this
產品的內部表象:spa
產品不一樣組成成分構成(組件)這些零件能夠是對象,也能夠是非對象,稱爲內部表象(internal representation),不一樣的產品能夠有不一樣的內部表象,也就是不一樣的零件,使用建造模式可使客戶端不須要知道生產的產品有哪些零件,每一個產品的對應零件批次有什麼不一樣,是怎麼建造出來的,怎麼組裝產品。code
內部表象的建造:對象
構建對象的過程外化到另外一個建造者對象內完成,而建造者對象返回給客戶端的是一個建設完畢的產品對象(將零件的構建跟產品的交付分開)。blog
uml結構圖:接口
四個角色:get
抽象構建者(Builder)角色:給出抽象接口,規範產品對象的組件的生產方式,該接口一般獨立於應用程序的商業邏輯。抽象的方法每每與對象的組件有關。產品
具體建造者(ConCreateBuilder)角色:實現抽象接口,完成組件的構建,並提供一個方法用於組裝最終的產品。
導演者(director)角色:調用具體的建造者角色以建立產品對象,僅僅起到指揮的做用。
產品(product)角色:產品是最終的產品角色,包含各類不一樣的組件。
導演者角色是與客戶端打交道的角色。導演者將客戶端建立產品的請求劃分爲對各個零件的建造請求,再將這些請求委派給具體建造者角色。具體建造者角色是作具體建造工做的,可是卻不爲客戶端所知。
通常來講,每有一個產品類,就有一個相應的具體建造者類。這些產品應當有同樣數目的零件,而每有一個零件就相應地在全部的建造者角色裏有一個建造方法。
產品類product
public class Product { /** * 定義一些關於產品的操做 */ private String part1; private String part2; public String getPart1() { return part1; } public void setPart1(String part1) { this.part1 = part1; } public String getPart2() { return part2; } public void setPart2(String part2) { this.part2 = part2; } }
抽象建造者類Builder
public interface Builder { public void buildPart1(); public void buildPart2(); public Product retrieveResult(); }
具體建造者類ConcreteBuilder
public class ConcreteBuilder implements Builder { private Product product = new Product(); /** * 產品零件建造方法1 */ @Override public void buildPart1() { //構建產品的第一個零件 product.setPart1("編號:9527"); } /** * 產品零件建造方法2 */ @Override public void buildPart2() { //構建產品的第二個零件 product.setPart2("名稱:XXX"); } /** * 產品返還方法 */ @Override public Product retrieveResult() { return product; } }
導演者類Director
public class Director { /** * 持有當前須要使用的建造器對象 */ private Builder builder; /** * 構造方法,傳入建造器對象 * @param builder 建造器對象 */ public Director(Builder builder){ this.builder = builder; } /** * 產品構造方法,負責調用各個零件建造方法 */ public void construct(){ builder.buildPart1(); builder.buildPart2(); } }
客戶端類Client
public class Client { public static void main(String[]args){ Builder builder = new ConcreteBuilder(); Director director = new Director(builder); director.construct(); Product product = builder.retrieveResult(); System.out.println(product.getPart1()); System.out.println(product.getPart2()); } }