建造者模式
建造者模式依旧是一种创建型设计模式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
举个例子,假如你要构建一个类的对象,需要往里面传50个参数。那么构建的时候,可以先构建part1,然后再构建part2,等等,最后构建完成。
为什么要折腾这么多事情,不能一次构建完吗?
那么你每次需要构建的时候都把需要的参数填上,不需要的填null,每次构建都填五十多个,会把人类似,所以最好还是用builder。
当使用建造者模式时,通常会有一个产品类、一个建造者类和一个指导者类。
以创建一个简单的汽车对象为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| class Car { private String make; private String model; private int year; private String color;
public Car(String make, String model, int year, String color) { this.make = make; this.model = model; this.year = year; this.color = color; }
public String getMake() { return make; }
public String getModel() { return model; }
public int getYear() { return year; }
public String getColor() { return color; }
@Override public String toString() { return "Car{" + "make='" + make + '\'' + ", model='" + model + '\'' + ", year=" + year + ", color='" + color + '\'' + '}'; } }
class CarBuilder { private String make; private String model; private int year; private String color;
public CarBuilder setMake(String make) { this.make = make; return this; }
public CarBuilder setModel(String model) { this.model = model; return this; }
public CarBuilder setYear(int year) { this.year = year; return this; }
public CarBuilder setColor(String color) { this.color = color; return this; }
public Car build() { return new Car(make, model, year, color); } }
class CarDirector { public Car constructSportsCar() { return new CarBuilder() .setMake("Ferrari") .setModel("488 GTB") .setYear(2022) .setColor("Red") .build(); } }
public class BuilderPatternExample { public static void main(String[] args) { CarDirector carDirector = new CarDirector(); Car sportsCar = carDirector.constructSportsCar(); System.out.println(sportsCar); } }
|
当然建造者类CarBuilder也可以放到Car类里面作为一个静态内部类,只用来构建Car,所以也可以称为静态工厂。
如果想要修改构造的参数数量或顺序的话,只需要修改CarDirector类就可以了,不需要的参数注释掉,不用每次都传入。