建造者模式详解

建造者模式详解

1.1 建造者模式概述

1.1.1 定义

建造者模式(Builder Pattern)将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型设计模式。

  • 构建与表示分离:构建代表对象创建,表示代表对象行为、方法,也就是将对象的创建与行为分离。
  • 创建不同的表示:也就是具备同样的行为,但是由于构建的行为顺序不同或其他原因可以创建出不同的表示。

1.1.2 应用场景

  • 相同的方法,不同的执行顺序,产生不同的结果
  • 多种不同变量,组装到一个对象,产生的结果不相同
  • 不同的调用顺序会产生不同的作用
  • 初始化对象过程复杂并且很多参数有默认值

1.2 建造者模式的通用写法

package org.example.builder;

import org.example.prototype.Person;

public interface IBuilder {
    Person builder();
}
package org.example.builder;

import org.example.prototype.Person;

public class ConcreateBuilder implements IBuilder{

    private Person person =new Person();
    @Override
    public Person builder() {
        return person;
    }
}

建造者
建造者模式主要包含4个角色:

  • 需要创建的对象
  • 抽象建造者
  • 具体建造者
  • 调用者

2.1建造者模式结局实际问题

2.2.1建造者模式的链式写法

package org.example.builder;

import lombok.Data;

@Data
public class Car {
    // 发动机
    private String engine;

    private String wheel;

    private String skeleton;
}
package org.example.builder;

public class CarBuilder {

    private Car car = new Car();

    public CarBuilder buildWheel(String wheel) {
        car.setWheel(wheel);
        return this;
    }

    public CarBuilder buildEngine(String engine) {
        car.setEngine(engine);
        return this;
    }

    public CarBuilder buildSkeleton(String skeleton) {
        car.setSkeleton(skeleton);
        return this;
    }

    public Car buildCar() {
        return car;
    }
}

package org.example.builder;

public class BuilderTest {
    public static void main(String[] args) {
        Car car = new CarBuilder().buildWheel("米其林静音胎")
                .buildEngine("2.0T")
                .buildSkeleton("铝合金")
                .buildCar();
    }
}

这种链式的写法是比较常用的,我们经常会在使用JDK的类或者框架源码中看到。
再介绍另一种写法,静态内部类方式对builder进行封装:

package org.example.builder;

import lombok.Data;

@Data
public class Car {
    // 发动机
    private String engine;

    private String wheel;

    private String skeleton;
    
    public static class Builder{
        private Car car = new Car();

        public Builder buildWheel(String wheel) {
            car.setWheel(wheel);
            return this;
        }

        public Builder buildEngine(String engine) {
            car.setEngine(engine);
            return this;
        }

        public Builder buildSkeleton(String skeleton) {
            car.setSkeleton(skeleton);
            return this;
        }

        public Car buildCar() {
            return car;
        }
    }
}

这样的写法使产品和创建之间的联系更紧密,结构更紧凑,便于维护。

3.1 建造者模式在框架源码中的应用

3.1.1 在JDK源码中的应用

  • StringBuilder
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
.....
    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
    public StringBuilder append(StringBuffer sb) {
        super.append(sb);
        return this;
    }

可以看到append方法是标准的链式写法。

3.1.2 建造者模式在Spring源码中的应用

  • BeanDefinitionBuilder
    BeanDefinitionBuilder

4.1 建造者模式扩展

4.1.1 建造者模式与工厂模式的区别

  • 建造者模式更注重方法的调用顺序,组装的方式会影响创建出来的对象的不同,而工厂模式创建出来的对象都一样。
  • 关注点不一样,建造者模式需要知道对象是由哪些部件组成,工厂模式不需要知道细节。

4.1.2 优缺点

优点:

  • 封装性好,构建和表示分离
  • 扩展性好,建造类之间独立,在一定程度上解耦
  • 将复杂对象拆分,便于控制细节
    缺点
  • 代码复杂度增加
  • 如果产品内部发生变化,建造者需同步修改,增加了一定的维护成本
posted @   amazing_yml  阅读(207)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示