建造者模式
定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以有不同的表示。比如不同的车有不同的牌子、车型、颜色等。客户端想要白色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》作者说过,方法参数超过三个以上就要考虑使用建造者模式。不足之处望指教。