java设计模式之建造者模式

本文深入解析建造者模式的定义、优缺点及应用场景,通过汉堡、可乐等快餐组合的类比,阐述如何利用该模式创建复杂的对象,如汽车,同时提供详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 建造者模式:
一、定义:将复杂对象的构建过程与其表示分离,使得同样的构建过程可以产生不同的表现形式。
二、优点:解耦,使得复杂对象的创建过程更加清晰,可以根据需求适当调整各部件顺序。扩展具有相同组件,组件顺序不同的产品很方便,只需要在指挥者中修改代码。。
三、缺点:需要有很多相同的组件,范围受限。如果产品组件内部变化很大,则需要实现很多具体建造者,使得系统变得很大。        
四、涉及角色
         1、建造者builder:提供一个抽象的接口标准,定义了构建复杂对象所需的各部分组件的方法,但不涉及具体的实现逻辑。
         2、具体建造者concrete builder:实现builder接口,实现具体的业务逻辑,定义了各个组件的实现过程,并提供对象实例。
         3、指挥者director:通过调用具体建造者中实现的各个组件的方法,按照一定顺序,构建负责对象,并返回复杂对象。
         4、复杂对象product:要实现的产品。
五、使用场景:多个复杂对象具有相同的基本组件,组件顺序需要变化。
         例如:去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。

六、示意图

七:实例代码 

package com.wms.builderPattern;

/**
 * @date:2018/11/13
 * @desc: 岗位 product 要实现的复杂对象。
 */
public class Car {

    private String lunzi;
    private String chexiang;
    private String fangxiangpan;

    public String getLunzi() {
        return lunzi;
    }

    public void setLunzi(String lunzi) {
        this.lunzi = lunzi;
    }

    public String getChexiang() {
        return chexiang;
    }

    public void setChexiang(String chexiang) {
        this.chexiang = chexiang;
    }

    public String getFangxiangpan() {
        return fangxiangpan;
    }

    public void setFangxiangpan(String fangxiangpan) {
        this.fangxiangpan = fangxiangpan;
    }

    @Override
    public String toString() {
        return "Car{" +
                "lunzi='" + lunzi + '\'' +
                ", chexiang='" + chexiang + '\'' +
                ", fangxiangpan='" + fangxiangpan + '\'' +
                '}';
    }
}
package com.wms.builderPattern;

/**
 * @date:2018/11/13
 * @desc: 岗位:建造者 builder
 */
public interface CarBuilder {
    void buildLunzi();
    void buildChexiang();
    void buildFangxiangpan();
    Car buildCar();
}
package com.wms.builderPattern;

/**
 * @date:2018/11/13
 * @desc: 岗位:具体建造者1
 */
public class BaomaCarBuilder implements CarBuilder {

    private Car car = new Car();

    public void buildLunzi() {
        car.setLunzi("宝马车的轮子");

    }

    public void buildChexiang() {
        car.setChexiang("宝马车的车厢");
    }

    public void buildFangxiangpan() {
        car.setFangxiangpan("宝马车的方向盘");
    }

    public Car buildCar() {
        return car;
    }

}
package com.wms.builderPattern;

/**
 * @date:2018/11/13
 * @desc: 岗位:具体建造者2
 */
public class BenchiCarBuilder implements CarBuilder {

    Car car = new Car();

    public void buildLunzi() {
        car.setLunzi("奔驰的轮子");
    }

    public void buildChexiang() {
        car.setChexiang("奔驰的车厢");
    }

    public void buildFangxiangpan() {
        car.setFangxiangpan("奔驰的方向盘");
    }

    public Car buildCar() {
        return car;
    }

}
package com.wms.builderPattern;

/**
 * @date:2018/11/13
 * @desc: 岗位:指挥者director 负责product各部分的构建顺序,并返回复杂对象。
 */
public class Director {

    public Car getCar(CarBuilder carBuilder) {
        carBuilder.buildLunzi();
        carBuilder.buildChexiang();
        carBuilder.buildFangxiangpan();
        return carBuilder.buildCar();
    }

}
package com.wms.builderPattern;

/**
 * @date:2018/11/13
 * @desc:  建造者模式测试      
 */
public class BuilderDemo {

    public static void main(String[] args) {
        //
        Director director = new Director();

        Car baomaCar = director.getCar(new BaomaCarBuilder());
        System.out.println(baomaCar.toString());


        Car BenchiCar = director.getCar(new BenchiCarBuilder());
        System.out.println(BenchiCar.toString());



    }


}

结果: 

Car{lunzi='宝马车的轮子', chexiang='宝马车的车厢', fangxiangpan='宝马车的方向盘'}
Car{lunzi='奔驰的轮子', chexiang='奔驰的车厢', fangxiangpan='奔驰的方向盘'}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值