文章同步發放到CSDN博客
一、場景
當需要生產一輛汽車時,我們需要為其裝配發動機、輪胎、座椅等等部件,這個裝配過程是比較復雜的而且也需要較高的組裝技術。而建造者模式(Builder Pattern)就是為了將部件與組裝分離開。
二、 概念
將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。
與抽象工廠的區別:在建造者模式里,有個指導者,由指導者來管理建造者,用戶是與指導者聯系的,指導者聯系建造者最后得到產品。即建造模式可以強制實行一種分步驟進行的建造過程。
建造模式是將復雜的內部創建封裝在內部,對于外部調用的人來說,只需要傳入建造者和建造工具,對于內部是如何建造成成品的,調用者無需關心。
三、建造者模式結構組成
- Product: 表示被構造的復雜對象,其中包含需要構建的部件屬性。
- Builder: 創建一個產品對象的各個部件指定抽象接口。
- ConcreteBuilder: 實現Builder的接口以構造和裝配該產品的各個部件,定義并明確它所創建的表示。
- Director: 調用具體建造者角色以創建產品對象。
下面以構建一輛汽車為例,寫示例代碼:
1.Product角色:組裝一輛汽車首先的有各種配件,如發動機、輪胎、座椅等。
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角色:知道了所需配件后,就需要生產配件了,定義一個生產配件的抽象建造者接口。
public interface Builder {
String buildEngine();
String buildTyre();
String buildSeat();
}
3.ConcreteBuilder角色:實現抽象的 建造者接口生成具體的建造者,并開始生產具體的配件。
public class CarBuilder implements Builder{
@Override
public String buildEngine() {
// 生產發動機
return "發動機";
}
@Override
public String buildTyre() {
// 生產輪胎
return "輪胎";
}
@Override
public String buildSeat() {
// 生產座椅
return "座椅";
}
}
4.Director角色:在生產出配件后,由指導者指導組裝配件生成汽車。
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());
}
}