文章同步發(fā)放到CSDN博客
一奸腺、場景
當(dāng)需要生產(chǎn)一輛汽車時阔涉,我們需要為其裝配發(fā)動機、輪胎善玫、座椅等等部件可霎,這個裝配過程是比較復(fù)雜的而且也需要較高的組裝技術(shù)。而建造者模式(Builder Pattern)就是為了將部件與組裝分離開宴杀。
二癣朗、 概念
將一個復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示旺罢。
與抽象工廠的區(qū)別:在建造者模式里旷余,有個指導(dǎo)者,由指導(dǎo)者來管理建造者扁达,用戶是與指導(dǎo)者聯(lián)系的正卧,指導(dǎo)者聯(lián)系建造者最后得到產(chǎn)品。即建造模式可以強制實行一種分步驟進(jìn)行的建造過程跪解。
建造模式是將復(fù)雜的內(nèi)部創(chuàng)建封裝在內(nèi)部炉旷,對于外部調(diào)用的人來說,只需要傳入建造者和建造工具,對于內(nèi)部是如何建造成成品的窘行,調(diào)用者無需關(guān)心饥追。
三、建造者模式結(jié)構(gòu)組成
- Product: 表示被構(gòu)造的復(fù)雜對象,其中包含需要構(gòu)建的部件屬性罐盔。
- Builder: 創(chuàng)建一個產(chǎn)品對象的各個部件指定抽象接口但绕。
- ConcreteBuilder: 實現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件,定義并明確它所創(chuàng)建的表示惶看。
- Director: 調(diào)用具體建造者角色以創(chuàng)建產(chǎn)品對象捏顺。
下面以構(gòu)建一輛汽車為例,寫示例代碼:
1.Product角色:組裝一輛汽車首先的有各種配件纬黎,如發(fā)動機幅骄、輪胎、座椅等莹桅。
public class Car{
public String engine;
public String tyre;
public String seat;
public Car(){
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getTyre() {
return tyre;
}
public void setTyre(String tyre) {
this.tyre = tyre;
}
public String getSeat() {
return seat;
}
public void setSeat(String seat) {
this.seat = seat;
}
}
2.Builder角色:知道了所需配件后昌执,就需要生產(chǎn)配件了,定義一個生產(chǎn)配件的抽象建造者接口诈泼。
public interface Builder {
String buildEngine();
String buildTyre();
String buildSeat();
}
3.ConcreteBuilder角色:實現(xiàn)抽象的 建造者接口生成具體的建造者懂拾,并開始生產(chǎn)具體的配件。
public class CarBuilder implements Builder{
@Override
public String buildEngine() {
// 生產(chǎn)發(fā)動機
return "發(fā)動機";
}
@Override
public String buildTyre() {
// 生產(chǎn)輪胎
return "輪胎";
}
@Override
public String buildSeat() {
// 生產(chǎn)座椅
return "座椅";
}
}
4.Director角色:在生產(chǎn)出配件后铐达,由指導(dǎo)者指導(dǎo)組裝配件生成汽車岖赋。
public class CarDirector {
CarBuilder cb;
public CarDirector(CarBuilder cb){
this.cb=cb;
}
public Car constructCar(){
Car car=new Car();
car.setEngine(cb.buildEngine());
car.setTyre(cb.buildTyre());
car.setSeat(cb.buildSeat());
return car;
}
}
5.最終得到一輛汽車:
public class Client {
public static void main(String[] args) {
CarDirector carDirector=new CarDirector(new CarBuilder());
Car car=carDirector.constructCar();
System.out.println(car.getEngine()+car.getTyre()+car.getSeat());
}
}