定义:
建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:Separate the construction ofa complex object from its representation so that the sameconstruction process can create diferent representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)
建造者模式通用类图
建造者模式将一个复杂对象的构建过程分解为多个相对简单的步骤,然后根据不同的需求,由具体的建造者来执行这些步骤,从而构建出不同的对象。其核心思想是将对象的构建过程封装起来,使得用户无需关心具体的构建细节,只需指定需要构建的类型即可得到相应的对象。
角色:
建造者模式包含以下几个核心角色:
1、产品(Product) :是指需要构建的复杂对象,它包含了多个组成部分(属性)。
2、抽象建造者(Builder) :定义了构建产品各个组成部分的抽象方法,以及返回最终产品的方法。它是具体建造者的父类,为所有具体建造者提供了统一的接口。
3、具体建造者(ConcreteBuilder) :实现了抽象建造者中定义的方法,负责具体构建产品的各个部分。每个具体建造者都可以根据自身的逻辑来构建产品,从而生成不同的产品实例。
4、演类(Director) :负责安排构建产品的具体步骤顺序,它持有一个抽象建造者的引用,并通过调用建造者的方法来构建产品。指挥者可以根据不同的需求,制定不同的构建顺序,从而指导建造者构建出不同结构的产品。
代码示例:
下面我们通过一个简单的示例来演示建造者模式的实现。我们以构建汽车为例,汽车由发动机、车身、轮胎等部分组成。
// 产品-汽车
public class Car {
// 发动机
private String engine;
// 车身
private String body;
// 轮胎
private String tire;
// 设置发动机
public void setEngine(String engine) {
this.engine = engine;
}
// 设置车身
public void setBody(String body) {
this.body = body;
}
// 设置轮胎
public void setTire(String tire) {
this.tire = tire;
}
public void show() {
System.out.println("汽车的各个部件信息:");
System.out.println("发动机:" + engine);
System.out.println("车身:" + body);
System.out.println("轮胎:" + tire);
}
}
// 建造者抽象类
public abstract class Builder {
protected Car car = new Car();
// 构建发动机
public abstract void buildEngine(String engine);
// 构建车身
public abstract void buildBody(String body);
// 构建轮胎
public abstract void buildTire(String tire);
public Car getCar() {
return car;
}
}
// BUS汽车建造者
public class BUSCarBuilder extends Builder{
@Override
public void buildEngine(String engine) {
car.setEngine("BUS发动机:" + engine);
}
@Override
public void buildBody(String body) {
car.setBody("BUS车身:" + body);
}
@Override
public void buildTire(String tire) {
car.setTire("BUS轮胎:" + tire);
}
}
// SUV 汽车建造者
public class SUVCarBuilder extends Builder{
@Override
public void buildEngine(String engine) {
car.setEngine("SUV发动机:" + engine);
}
@Override
public void buildBody(String body) {
car.setBody("SUV车身:" + body);
}
@Override
public void buildTire(String tire) {
car.setTire("SUV轮胎:" + tire);
}
}
// 指挥者
public class Director {
public Car getCar(Builder builder, String engine, String body, String tire) {
builder.buildEngine(engine);
builder.buildBody(body);
builder.buildTire(tire);
return builder.getCar();
}
}
// 使用示例
public class Client {
public static void main(String[] args) {
Director director = new Director();
// BUS
BUSCarBuilder busCarBuilder = new BUSCarBuilder();
Car bus = director.getCar(busCarBuilder, "BYD487ZQC", "铝合金车身", "玲珑轮胎");
bus.show();
// SUV
SUVCarBuilder suvCarBuilder = new SUVCarBuilder();
Car suv = director.getCar(suvCarBuilder, "BYD371QA", "铝合金车身", "佳通轮胎");
suv.show();
}
}
优点 :
1、分离构建与表示:将对象的构建过程与表示分离,使得代码结构更加清晰,符合单一职责原则。
2、易于扩展:通过定义新的具体建造者,可以方便地扩展出不同的构建策略,从而创建出不同类型的对象,无需修改现有代码。
3、精确控制构建过程:指挥者可以精确控制对象的构建步骤顺序,确保每个步骤都按照预期的顺序执行,从而保证对象的构建过程的正确性。
缺点:
1、增加类的数量:建造者设计模式需要定义抽象建造者、具体建造者、指挥者等多个类,这会增加系统的类数量,可能会使代码结构变得相对复杂。
2、适用场景有限:建造者设计模式适用于对象构建过程复杂且需要分步构建的场景,对于简单对象的创建,使用该模式可能会显得过于繁琐,反而不如直接使用构造函数更加简单直接。
使用场景:
(一)对象构建过程复杂
当需要构建的对象由多个部分组成,且各个部分的构建过程较为复杂,或者需要遵循特定的顺序时,使用建造者设计模式可以将复杂的构建过程分解为多个简单的步骤,使代码更加清晰、易于维护。
(二)需要生成不同类型的对象
如果需要根据不同的需求生成不同类型的对象,例如不同配置的电脑、不同款式的汽车等,通过定义不同的具体建造者,可以方便地实现这一需求,而无需修改产品类和指挥者类的代码。
(三)需要将构建过程与对象表示分离
当希望将对象的构建过程与对象本身的表示分离时,建造者设计模式可以将构建逻辑封装在建造者类中,使得产品类只负责存储数据,而构建过程由建造者类来处理,从而提高代码的灵活性和可扩展性。
建造者设计模式是一种非常实用的创建型设计模式,它通过将复杂对象的构建过程分解为多个简单的步骤,并由专门的建造者来执行这些步骤,使得我们可以更加灵活、优雅地创建复杂对象。通过合理运用建造者设计模式,可以提高代码的可维护性、可扩展性和灵活性,使我们的代码更加符合面向对象的设计原则。在实际开发中,当遇到需要创建复杂对象且构建过程较为繁琐的场景时,不妨考虑使用建造者设计模式,它将为你提供一种高效、优雅的解决方案。