创建者模式-建造者模式

定义:

建造者模式(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、适用场景有限:建造者设计模式适用于对象构建过程复杂且需要分步构建的场景,对于简单对象的创建,使用该模式可能会显得过于繁琐,反而不如直接使用构造函数更加简单直接。


使用场景: 

(一)对象构建过程复杂​

        当需要构建的对象由多个部分组成,且各个部分的构建过程较为复杂,或者需要遵循特定的顺序时,使用建造者设计模式可以将复杂的构建过程分解为多个简单的步骤,使代码更加清晰、易于维护。​

(二)需要生成不同类型的对象​

        如果需要根据不同的需求生成不同类型的对象,例如不同配置的电脑、不同款式的汽车等,通过定义不同的具体建造者,可以方便地实现这一需求,而无需修改产品类和指挥者类的代码。​

(三)需要将构建过程与对象表示分离​

        当希望将对象的构建过程与对象本身的表示分离时,建造者设计模式可以将构建逻辑封装在建造者类中,使得产品类只负责存储数据,而构建过程由建造者类来处理,从而提高代码的灵活性和可扩展性。

        建造者设计模式是一种非常实用的创建型设计模式,它通过将复杂对象的构建过程分解为多个简单的步骤,并由专门的建造者来执行这些步骤,使得我们可以更加灵活、优雅地创建复杂对象。通过合理运用建造者设计模式,可以提高代码的可维护性、可扩展性和灵活性,使我们的代码更加符合面向对象的设计原则。在实际开发中,当遇到需要创建复杂对象且构建过程较为繁琐的场景时,不妨考虑使用建造者设计模式,它将为你提供一种高效、优雅的解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值