簡介
1.指揮者(Director)直接和客戶(Client)進行需求溝通;
2. 溝通後指揮者将客戶建立産品的需求劃分為各個部件的建造請求(Builder);
3. 将各個部件的建造請求委派到具體的建造者(ConcreteBuilder);
4. 各個具體建造者負責進行産品部件的建構;
5. 最終建構成具體産品(Product)
執行個體
1.電腦城老闆(Diretor)和小成(Client)進行需求溝通(買來打遊戲?學習?看片?)
2.了解需求後,電腦城老闆将小成需要的主機劃分為各個部件(Builder)的建造請求(CPU、主機闆blabla)
3.指揮裝機人員(ConcreteBuilder)去建構元件;
4.将元件組裝起來成小成需要的電腦(Computer)
UML
代碼:
package com.sl.demo.builder;
import java.util.ArrayList;
import java.util.List;
/**
* 電腦
* @author pengkun
*
*/
public class Computer {
//電腦由小件組裝而成
private List<String> parts=new ArrayList<>();
//電腦留有插零件的接口
public void add(String part) {
parts.add(part);
}
//展示自己(電腦屬性)
public void showMe() {
for (String part : parts) {
System.out.println("組裝了:"+part);
}
}
}
package com.sl.demo.builder;
/**
* 抽象組裝人員
* @author pengkun
*
*/
public interface Builder {
//主機闆
void installMain() ;
//cpu
void installCPU();
//硬碟
void installHDD();
//記憶體
void installMemory();
//組裝好傳回電腦
Computer getComputer() ;
}
package com.sl.demo.builder;
/**
* 具體實作建造者
* @author pengkun
*
*/
public class ConcreteBuilder implements Builder {
//持有一台待組裝的電腦
private Computer computer=new Computer();
@Override
public void installMain() {
computer.add("華碩主機闆");
}
@Override
public void installCPU() {
computer.add("core i8");
}
@Override
public void installHDD() {
computer.add("三星 SDD 512G");
}
@Override
public void installMemory() {
computer.add("金士頓 rd5 32G");
}
@Override
public Computer getComputer() {
return computer;
}
}
指揮者:
package com.sl.demo.builder;
/**
* 指揮者
* @author pengkun
*
*/
public class Director {
//叫實際建造者開始組裝(根據需求建構,說白了組裝電腦的配置由指揮者決定)
public void construct(Builder builder) {
builder.installMain();
builder.installCPU();
builder.installHDD();
builder.installMemory();
}
}
測試:
@Test
public void test() {
//老闆
Director director=new Director();
//組裝人員
Builder builder=new ConcreteBuilder();
//和老闆商談,然後老闆根據需求指揮組裝人員組裝一台什麼配置的電腦
director.construct(builder);
//組裝人員拿來電腦
Computer computer= builder.getComputer();
computer.showMe();
}
結果:
組裝了:華碩主機闆
組裝了:core i8
組裝了:三星 SDD 512G
組裝了:金士頓 rd5 32G
建造者模式的優點
1)封裝性:使用建造者模式可以是用戶端不必知道産品内部組成的細節。
2)建造者獨立,容易擴充
3)便于控制細節風險:由于具體的建造者是獨立的,是以可以對建造者過程逐漸細化,而不對其他的子產品産生任何影
缺點
1)相同的方法,不同的執行順序,産生不同的事件結果時,可以使用建造者模式。
2)多個部件或零件,都可以裝配到一個對象中,但是産生的運作結果又不想同時,可以使用建造者模式。
3)産品類非常複雜,或者産品類中的調用順序不同産生了不同的效能,這時候可以使用建造者模式。
4)在對象建立過程中會使用到系統的一些其他對象,這些對象在産品對象的建立過程中不易得到,也可以采用建造者模式封裝該對象的建立過程。這種場景隻能是一個補償的方法,因為一個對象不容易獲得,而在設計階段竟然沒有發現,而要通過設計這模式來柔化建立過程,本身設計已經出問題了。
到這裡,我們會發現,建造者模式和工廠方法模式有點像。但是兩者有差別:建造者模式關注的是零件類型和裝配工藝(順序),而工廠模式是建立一個對象,這是最大不同的地方。