- 建造者模式(Builder Pattern)
概述
建造者模式解决如下问题:
- 一个类(同样的建造过程)如何创建复杂对象的不同表示?
- 如何简化一个包含复杂对象的类?
直接在一个类中创建和装备在复杂对象的各部分是不灵活的设计,一个类创建复杂对象的特定表示,在以后如果想替换特定表示是不可能的。
建造者模式提供如下解决方法:
- 在一个分离的建造者对象中封装复杂对象的创建和装配。
- 一个类委托建造者创建对象,而不是直接创建对象。
一个类可以委托不同的建造者对象去创建一个复杂对象的不同的表示。
定义:
建造者模式的意图是将一个复杂对象的构造从它的表示中分离出来。同样的构造过程可创建不同的表示。
优点:
- 允许你变化一个产品的内部表示。
- 封装了复杂对象的构造和表示。
- 提供对构造过程的步骤的控制。
缺点:
- 要求为每一个不同给的产品类别创建一个分离的建造者。
- 要求建造者类是可变的。
- 类的数据成员不能保证被初始化。
- 不支持依赖注入。
class Car {
private int wheels;
private String color;
public Car() {
}
public String getColor() {
return color;
}
public void setColor(final String color) {
this.color = color;
}
public int getWheels() {
return wheels;
}
public void setWheels(final int wheels) {
this.wheels = wheels;
}
@Override
public String toString() {
return "Car [wheels = " + wheels + ", color = " + color + "]";
}
}
interface CarBuilder {
Car build();
CarBuilder setColor(final String color);
CarBuilder setWheels(final int wheels);
}
class CarBuilderImpl implements CarBuilder {
private Car car;
public CarBuilderImpl() {
car = new Car();
}
@Override
public Car build() {
return car;
}
@Override
public CarBuilder setColor(final String color) {
car.setColor(color);
return this;
}
@Override
public CarBuilder setWheels(final int wheels) {
car.setWheels(wheels);
return this;
}
}
public class CarBuildDirector {
private CarBuilder builder;
public CarBuildDirector(final CarBuilder builder) {
this.builder = builder;
}
public Car construct() {
return builder.setWheels(4)
.setColor("Red")
.build();
}
public static void main(final String[] arguments) {
final CarBuilder builder = new CarBuilderImpl();
final CarBuildDirector carBuildDirector = new CarBuildDirector(builder);
System.out.println(carBuildDirector.construct());
}
}