Java建造者设计模式
定义
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
对应角色
- Builder(抽象建造者):它为创建一个产品对象的各个部件指定抽象接口。
- ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
- Product(产品角色):它是被构建的复杂对象,包含多个组成部件。
- Director(指挥者):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
优缺点
优点
- 封装性好,用户只需知道具体建造者的类型就可以得到所建造的复杂对象,对于产品内部构成的细节不需要了解。
- 建造者模式将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
- 建造者模式更加关注与零件装配的顺序,使得一步步创建一个复杂对象时更加灵活,细节更容易控制。
缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似。如果产品之间的差异性很大,则不适合使用建造者模式。
- 如果产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
应用场景
- 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
- 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
- 对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
实例
class Computer {
private String cpu;
private String ram;
private String hardDisk;
private String keyboard;
private String mouse;
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void setRam(String ram) {
this.ram = ram;
}
public void setHardDisk(String hardDisk) {
this.hardDisk = hardDisk;
}
public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
}
public void setMouse(String mouse) {
this.mouse = mouse;
}
@Override
public String toString() {
return "Computer [cpu=" + cpu + ", ram=" + ram + ", hardDisk=" + hardDisk + ", keyboard=" + keyboard + ", mouse="
+ mouse + "]";
}
}
abstract class ComputerBuilder {
protected Computer computer = new Computer();
public abstract void buildCpu();
public abstract void buildRam();
public abstract void buildHardDisk();
public abstract void buildKeyboard();
public abstract void buildMouse();
public Computer getComputer() {
return computer;
}
}
class HighEndComputerBuilder extends ComputerBuilder {
@Override
public void buildCpu() {
computer.setCpu("Intel Core i9");
}
@Override
public void buildRam() {
computer.setRam("16GB");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("1TB");
}
@Override
public void buildKeyboard() {
computer.setKeyboard("Mechanical Keyboard");
}
@Override
public void buildMouse() {
computer.setMouse("Gaming Mouse");
}
}
class MidRangeComputerBuilder extends ComputerBuilder {
@Override
public void buildCpu() {
computer.setCpu("Intel Core i5");
}
@Override
public void buildRam() {
computer.setRam("8GB");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("512GB");
}