建造者模式
定義:將一個複雜的對象的構建與它的表示分離,使得同樣的構建過程可以有不同的表示。比如不同的車有不同的牌子、車型、顏色等。客戶端想要白色SUV的寶馬,或者黑色轎車的寶馬,而又不想幹涉建造它們,畢竟客戶端要處理很多事情,那麼就把建造任務交給其他人,返回車給客戶端就行,不需要知道怎麼建造的。
建造者通常包括四個角色:
- Builder : 抽象建造類,定義建造產品類需要的方法,且實例化產品類。
- ConcreteBuilder :具體建造類,實現抽象方法,建造產品。
- Product :產品類,提供屬性方法。
- Director :執行類,負責執行建造流程。
用上面車的例子代碼演示建造者模式。
Builder 汽車抽象建造者
public abstract class CarBuilder {
protected Car car = new Car();
protected abstract void buildColor();
protected abstract void buildType();
protected abstract void buildBrand();
public Car getCar() {
return car;
}
}
ConcreteBuilder 奔馳具體建造者
public class BenzBuilder extends CarBuilder{
protected void buildColor() {
car.setBrand("奔馳");
}
protected void buildType() {
car.setType("轎車");
}
protected void buildBrand() {
car.setColor("黑色");
}
}
Product 車屬性
public class Car {
private String color;
private String type;
private String brand;
getter/setter();
}
Director 汽車執行者
public class CarDiretor {
CarBuilder carbuilder;
public void setCarbuilder(CarBuilder carbuilder) {
this.carbuilder = carbuilder;
}
public Car getCar() {
carbuilder.buildBrand();
carbuilder.buildColor();
carbuilder.buildType();
return carbuilder.getCar();
}
}
客戶端
CarDiretor carDiretor = new CarDiretor();
carDiretor.setCarbuilder(new BenzBuilder());
Car car = carDiretor.getCar();//得出黑色轎車奔馳
到這都會有疑惑。繞了一大圈還不如new一個car直接setter/getter。確實如此。但是別忘了建造者模式的初衷,是與客戶端分離。需要建造其他車只要新建Builder就好了,客戶端不需要知道里面怎麼建造。
CarDiretor carDiretor = new CarDiretor();
carDiretor.setCarbuilder(new BMWBuilder());
Car car = carDiretor.getCar();//得出寶馬
簡化模式
上面也看到了,建造一輛車至少寫這麼多類,而且不同類型還需要創建不同的建造者,這相當麻煩,因此建造者模式坐冷板凳。如今建造者模式改頭換面,大牛們簡化這麼繁瑣的建造者模式。不需要抽象Builder和Director執行者,改寫具體Builder,再加上鍊式編程使代碼更加靈活,更加簡單。
public class CarBuilder {
private Car car = new Car();
public CarBuilder() {
//初始化的時候 可以設置默認值
car.setColor("白色");//默認白色
}
public CarBuilder setColor(String color) {
car.setColor(color);
return this;
}
public CarBuilder setType(String type) {
car.setType(type);
return this;
}
public CarBuilder setBrand(String brand) {
car.setBrand(brand);
return this;
}
public Car build() {
return car;
}
}
客戶端
Car car1 = new CarBuilder().setBrand("奔馳").setType("轎車").build();//白色轎車奔馳
Car car2 = new CarBuilder().setBrand("寶馬").setColor("紅色").setType("SUV").build();//紅色SUV寶馬
只要兩個類就搞定了。不需要的部分也可以去掉,比如紅色寶馬,SUV奔馳之類的組合。通常建造者模式都是使用這種方式。
總述
建造者模式是屬於創建型模式,它負責創建不同部件組合一起的一種對象。使用場景也有很多,《Effective Java》作者說過,方法參數超過三個以上就要考慮使用建造者模式。不足之處望指教。