Builder模式的理解!!
Builder
是為了將構建複雜物件的組裝過程和它的建立部件與產品物件分離.注意: 是解耦組裝過程和建立具體部件.
過程實現使用Director,它僅關心組裝部件的過程,不關心每個具體部件的建立。
而Builder則是定義出建立部件的介面,然而具體的建立,則是有ConcreteBuilder
來實現。
由於在Director使用是Builder介面所以,這樣就可以重用建立過程,因為
不同的ConcreteBuilder,雖然建立部件不同相同,但是組裝過程卻相同。
我們假設,每個汽車都有車輪,發動機等部件組成,如果不使用模式,按照一般的方法,
在建構函式中,建立部件車輪,發動機,並且然後進行了組裝。
下面以一輛Polo為例:
public class Polo{
//在建構函式中,建立部件,然後進行組裝
public Polo(){
//建立部件
車輪 obj1=new 車輪();
//進行組裝部件
this.車輪s.add(obj1);
車輪 obj2=new 車輪();
this.車輪s.add(obj2);
//這裡省略其他兩個車輪
.................
汽車發動機 objNessan=new 汽車發動機();
this.汽車發動機=objNessan;
}
//汽車的組成部件
public vector 車輪s=new Vector;
public 汽車發動機 汽車發動機 =null;
//這裡省略了其他部件和功能函式
.................
}
這就是我們沒有使用Builder的方式,這樣使建構函式相當的複雜。
因為它負責建立具體的部件如(4個車輪,和一個發動機),然後需要進行組裝成為產品Polo.
如果我們再增加一種車的型別HongDa,雖然它們種類不同,具體的部件不同,
但是組裝的過程相同和部件的抽象(4個車輪和一個發動機)相同。
這樣違背地OO的思想重用,於是我們把組裝的過程,和建立部件,從產品的構造中獨立出來,
其實就是簡化產品的建構函式,封裝成物件,來重用。
於是我們外部化一個Builder它負責建立汽車部件和組裝過程,因為建立的部件不同,如Polo的車輪和
HongDa的不同,但是它們的組裝過程卻是相同的,於是我們先定義,幾個方法將由它的具體子類實現,
和一個具體的方法,它負責組裝過程。明白的會看出這就是模板方法(Template Method)模式。
//它抽象了建立部件,定義一個骨架方法
public class Builder{
public void builder車輪(int n){};
public void builder發動機(){};
public void director構造過程(){
this.builder車輪(4);
this.builder車輪();
}
}
public class PoloBuilder extends Builder{
private Polo polo=new Polo();
public void builder車輪(int n){
for(int i=0;i<n;i++){
車輪 obj1=new 車輪();
polo.車輪s.add(obj1);
}
}
public void builder發動機(){
汽車發動機 objNessan=new 汽車發動機();
polo.汽車發動機=objNessan;
}
public Polo getProduct(){
return polo;
}
}
其實當builder模式的director角色和builder角色合併得化,它就是template method
模式。抽象方法負責建立部件,具體骨架方法負責組裝過程。這樣具體的builder只需實現抽象
方法。
Builder目前負責建立部件和組裝過程,如果我們把這兩個職責,
再進行劃分處理,單獨一個負責組裝過程,另一個負責建立部件。
因為雖然部件不同,但是過程是相同的。於是抽象出兩個類。
//該類負責建立部件,具體的由子類實現
public class Builder{
public void builder車輪(int n){};
public void builder發動機(){};
}
//該類實現組裝過程
public class Director{
private Builder builder=null;
public class Director(Builder builder){
this.builder=builder;
}
public void 組裝過程(){
builder.builder車輪(4);
builder.builder車輪();
}
}
在Director中使用builder介面,然後按照一定規則進行組裝,大家可以
看出這是針對介面進行程式設計的體現。我們看具體的builder
public class PoloBuilder extends Builder{
private Polo polo=new Polo();
public void builder車輪(int n){
for(int i=0;i<n;i++){
車輪 obj1=new 車輪();
polo.車輪s.add(obj1);
}
}
public void builder發動機(){
汽車發動機 objNessan=new 汽車發動機();
polo.汽車發動機=objNessan;
}
public Polo getProduct(){
return polo;
}
}
客戶端的使用,首先建立具體的builder,然後使用Director
PoloBuilder polobuild=new PoloBuilder();
Director d=new Director(polobuild);
d.組裝過程();
Product p=polobuild.getProduct();
相關文章
- Builder 模式UI模式
- Builder模式UI模式
- 我所理解的設計模式(C++實現)——建造者模式(Builder Pattern)設計模式C++UI
- 設計模式:Builder模式概述設計模式UI
- 建立模式 03-Builder模式模式UI
- JavaBean之Builder模式JavaBeanUI模式
- 建造者模式(Builder)模式UI
- Builder設計模式UI設計模式
- 詳解 - Builder模式UI模式
- Java設計模式之builder模式Java設計模式UI
- 設計模式-建造者模式(Builder)設計模式UI
- 生成器模式(Builder)模式UI
- 建造者模式(Builder Pattern)模式UI
- 設計模式-生成器模式Builder設計模式UI
- 【設計模式】- 生成器模式(Builder)設計模式UI
- 設計模式--建造者模式(Builder Pattern)設計模式UI
- 【設計模式筆記】(二)- Builder模式設計模式筆記UI
- Java設計模式----建造者模式(Builder)Java設計模式UI
- 設計模式之-建造者模式-Builder設計模式UI
- 設計模式的征途—6.建造者(Builder)模式設計模式UI
- Builder模式,今天你用了嘛UI模式
- Builder模式與Java語法UI模式Java
- 深入瞭解 Builder 模式 - frankelUI模式
- 構建者模式(Builder pattern)模式UI
- 設計模式Builder之惑設計模式UI
- 設計模式(五)Builder構建者模式設計模式UI
- Android設計模式探討--Builder模式Android設計模式UI
- 《設計模式》 - 3. 建立者模式( Builder )設計模式UI
- Android設計模式探討 Builder模式Android設計模式UI
- 設計模式--建造者模式Builder(建立型)設計模式UI
- Java設計模式之建造者模式(Builder)Java設計模式UI
- 賣熱乾麵的啟發 ---Builder 模式UI模式
- 用到的設計模式總結--單例模式+工廠方法模式+Builder模式設計模式單例UI
- Golang strings.Builder 原理解析GolangUI
- 重識設計模式-建造者模式(Builder Pattern)設計模式UI
- 設計模式十: 生成器模式(Builder Pattern)設計模式UI
- C#設計模式-建造者模式(Builder Pattern)C#設計模式UI
- 人人都會設計模式---建造者模式--Builder設計模式UI