建造者模式在Java里面十分常见,它将一个复杂对象的构造与表示分离,使同样的构建过程可以创建不同的表示,这中设计模式被称为建造者模式,最常见的AlertDialog.Builder类,用于创建dialog,其组成部分是不变的,但是每一个部分都可以灵活设置。
建造者模式的结构
建造者模式分为四个部分:具体产品,抽象建造者,具体建造者,使用者。举例:
static class Car {
String engine;
String frame;
String wheel;
public void setEngine(String engine) {
this.engine = engine;
}
public void setFrame(String frame) {
this.frame = frame;
}
public void setWheel(String wheel) {
this.wheel = wheel;
}
public void show() {
System.out.println(String.format(
"车的引擎型号:%s, 车的框架型号:%s, 车的轮子型号:%s。",
this.engine,this.frame,this.wheel
));
}
}
abstract static class Builder {
protected Car car = new Car();
abstract Builder buildEngine(String engine);
abstract Builder buildFrame(String frame);
abstract Builder buildWheel(String wheel);
public Car build() {
return car;
}
}
static class CarBuilder extends Builder {
@Override
CarBuilder buildEngine(String engine) {
car.setEngine(engine);
return this;
}
@Override
CarBuilder buildFrame(String frame) {
car.setFrame(frame);
return this;
}
@Override
CarBuilder buildWheel(String wheel) {
car.setWheel(wheel);
return this;
}
}
static class Buyer {
private CarBuilder builder;
public Buyer(CarBuilder builder) {
this.builder = builder;
}
private Car build() {
return builder.build();
}
}
@Test
public void main() {
CarBuilder builder = new CarBuilder();
builder.buildEngine("Type1").buildFrame("Type2").buildWheel("Type3");
Buyer buyer = new Buyer(builder);
Car car = buyer.build();
car.show();
}
输出结果:
-----------------------------------------------
车的引擎型号:Type1, 车的框架型号:Type2, 车的轮子型号:Type3。
-----------------------------------------------
这里以汽车作为具体产品,实际上汽车的创建是一个很复杂的对象,拥有众多的结构和不见,然后不同的汽车各个部分的组成可能不同,但是总的部分是相对固定的,所以可以使用建造者模式,Android中的AlertDialog是在产品只有dialog的情况下,忽略了抽象建造者和具体的使用者,通过·语法直接分部件组装。