为了解决什么问题?
建造者模式用来解决复杂对象的构建问题。当一个对象的构建过程复杂,包含多个组成部分,且每部分均可按不同的顺序和配置组合时,直接实例化该对象会导致构造方法非常庞大,并且难以理解。
使用建造者模式可以将一个复杂对象的构建过程封装在一个单独的Builder类中,分步骤进行构建,并允许使用不同的构建过程生成不同表现形式的对象。
怎么用代码实现?
下面是Java代码示例,先定义产品:
class Product {
private String partA;
private String partB;
public void show() {
System.out.println("PartA: " + partA + ", PartB: " + partB);
}
public void setPartA(String partA) {
this.partA = partA;
}
public void setPartB(String partB) {
this.partB = partB;
}
}
然后,定义抽象建造者和指挥者:
abstract class AbstractBuilder {
protected Product product = new Product();
public abstract AbstractBuilder buildPartA(String partA);
public abstract AbstractBuilder buildPartB(String partB);
public Product build() {
return product;
}
}
class Director {
public Product construct(AbstractBuilder builder) {
builder.buildPartA("A1");
builder.buildPartB("B1");
return builder.build();
}
}
接着,依据具体场景定义对应的建造者:
class ConcreteBuilder extends AbstractBuilder {
@Override
public AbstractBuilder buildPartA(String partA) {
product.setPartA(partA);
return this;
}
@Override
public AbstractBuilder buildPartB(String partB) {
product.setPartB(partB);
return this;
}
}
最后,使用指挥者依据指定的具体建造者,就可以愉快的构建产品对象了:
Director director = new Director();
AbstractBuilder builder = new ConcreteBuilder();
Product product = director.construct(builder);
product.show();
为什么可以解决这个问题?
建造者模式通过引入独立的Builder类来解决复杂对象的构建问题。这样做将对象的构建过程从其表现形式中抽离出来,允许逐步构建复杂对象并清晰控制每个构建步骤。
此外,相同的构建过程可以创建具有不同表现形式的多个对象,提高了代码的复用性和灵活性。
建造者模式适用于哪些场景?
建造者模式适用于以下几种场景:
复杂对象的创建:当创建的对象由多个组成部分构成,且组件的构建顺序和配置可变时,建造者模式特别有用。
参数对象的构建:当函数或方法需要接收大量参数时,建造者模式可以帮助客户端构建含有多个可选参数的参数对象。
不同表示的对象构建:建造者允许使用相同的构建代码创建不同表示(例如风格、布局)的对象。
建造者模式在开源代码中很常见,下面是一些经典的应用案例:
java.lang.StringBuilder/StringBuffer:在Java标准库中,StringBuilder及其线程安全版本StringBuffer内部使用建造者模式构建字符串对象。
android.app.AlertDialog:在Android开发中,AlertDialog的创建经常使用Builder模式,允许设置标题、消息内容、按钮等属性,并保持易于阅读和维护。
java.nio.ByteBuffer等Buffer类:Java NIO的Buffer类提供了put方法来逐步构建缓冲区的内容。
javax.swing.GroupLayout:Swing库中的GroupLayout允许通过连缀方式构建复杂的GUI组件布局。
建造者模式提供了一个灵活而强大的方式来构建复杂的对象,同时让代码保持清晰,提高了代码的可读性。
此外,由于建造者模式对构建过程进行了细致的管理,因此容易对构建过程和所产生的对象实例进行测试和验证。
———————————这是分割线———————————
欢迎添加博主vx深入交流: