建造者模式

建造者模式

MyBatis在SqlSessionFactory这一层使用了Builder模式

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象

用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)

  • 优点
    • 产品的创建和表示分离,客户端不必知道产品内部组成细节(房子内部组成细节是工人去做的,我不用知道)如果想要改变产品内部,只需要定义一个新的具体建造者
  • 缺点
    • 建造者模式建造的产品一般具有较多相同点,如果差异大,不适合使用建造者模式
  • 应用场景
    • 产品对象内部很复杂,产品对象有很多共同点
角色分析

代码

Builder

//抽象的建造者:定义方法
public abstract class Builder {
    abstract void buildCpu();//cpu
    abstract void buildMemory();//内存
    abstract void buildDisk();//硬盘
    abstract void buildKeyboard();//键盘
    //得到产品
    abstract Computer getComputer();//
}

具体的建造者ComputerWorker

//具体的建造者:
public class ComputerWorker extends Builder {

    private Computer computer;

    public ComputerWorker() {
        this.computer = new Computer();
    }

    @Override
    void buildCpu() {
        computer.setBuildCpu("cpu");
        System.out.println("cpu");
    }

    @Override
    void buildMemory() {
        computer.setBuildMemory("内存");
        System.out.println("内存");
    }

    @Override
    void buildDisk() {
        computer.setBuildDisk("硬盘");
        System.out.println("硬盘");
    }

    @Override
    void buildKeyboard() {
        computer.setBuildKeyboard("键盘");
        System.out.println("键盘");
    }

    @Override
    Computer getComputer() {
        return computer;
    }
}

产品:Computer

//产品:电脑
public class Computer {
    private String buildCpu;
    private String buildMemory;
    private String buildDisk;
    private String buildKeyboard;

    public String getBuildCpu() {
        return buildCpu;
    }

    public void setBuildCpu(String buildCpu) {
        this.buildCpu = buildCpu;
    }

    public String getBuildMemory() {
        return buildMemory;
    }

    public void setBuildMemory(String buildMemory) {
        this.buildMemory = buildMemory;
    }

    public String getBuildDisk() {
        return buildDisk;
    }

    public void setBuildDisk(String buildDisk) {
        this.buildDisk = buildDisk;
    }

    public String getBuildKeyboard() {
        return buildKeyboard;
    }

    public void setBuildKeyboard(String buildKeyboard) {
        this.buildKeyboard = buildKeyboard;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "buildCpu='" + buildCpu + '\'' +
                ", buildMemory='" + buildMemory + '\'' +
                ", buildDisk='" + buildDisk + '\'' +
                ", buildKeyboard='" + buildKeyboard + '\'' +
                '}';
    }
}

指挥者Director

public class Director {
    //指挥工人按照顺序造电脑
    public Computer build(Builder builder) {
        builder.buildMemory();
        builder.buildCpu();
        builder.buildDisk();
        builder.buildKeyboard();
        return builder.getComputer();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        //指挥,可以控制电脑零件生产的先后顺序
        Director director = new Director();
        //指挥具体的工人造电脑
        Computer computer = director.build(new ComputerWorker());
        System.out.println(computer);
    }
}

大多数情况下,要什么产品由客户决定,不需要指挥者

Builder

public abstract class Builder {
    abstract Builder builderCpu(String msg);
    abstract Builder builderMemory(String msg);
    abstract Builder builderDisk(String msg);
    abstract Builder builderKeyboard(String msg);
    abstract Computer getComputer();
}

具体的建造者ComputerWorker

public class ComputerWorker extends Builder {

    //具体建造者建造什么产品,电脑
    private Computer computer;

    public ComputerWorker() {
        this.computer = new Computer();
    }

    @Override
    Builder builderCpu(String msg) {
        computer.setBuildCpu(msg);
        return this;
    }

    @Override
    Builder builderMemory(String msg) {
        computer.setBuildMemory(msg);
        return this;
    }

    @Override
    Builder builderDisk(String msg) {
        computer.setBuildDisk(msg);
        return this;
    }

    @Override
    Builder builderKeyboard(String msg) {
        computer.setBuildKeyboard(msg);
        return this;
    }

    @Override
    Computer getComputer() {
        return this.computer;
    }
}

产品:Computer

public class Computer {
    private String buildCpu = "intel cpu";
    private String buildMemory = "金士顿内存";
    private String buildDisk = "三星硬盘";
    private String buildKeyboard = "罗技键盘";

    public String getBuildCpu() {
        return buildCpu;
    }

    public void setBuildCpu(String buildCpu) {
        this.buildCpu = buildCpu;
    }

    public String getBuildMemory() {
        return buildMemory;
    }

    public void setBuildMemory(String buildMemory) {
        this.buildMemory = buildMemory;
    }

    public String getBuildDisk() {
        return buildDisk;
    }

    public void setBuildDisk(String buildDisk) {
        this.buildDisk = buildDisk;
    }

    public String getBuildKeyboard() {
        return buildKeyboard;
    }

    public void setBuildKeyboard(String buildKeyboard) {
        this.buildKeyboard = buildKeyboard;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "buildCpu='" + buildCpu + '\'' +
                ", buildMemory='" + buildMemory + '\'' +
                ", buildDisk='" + buildDisk + '\'' +
                ", buildKeyboard='" + buildKeyboard + '\'' +
                '}';
    }
}

测试

//需要什么牌子设备由用户决定,不选用默认值
public class Test {
    public static void main(String[] args) {
        ComputerWorker worker = new ComputerWorker();
        //链式编程
        Computer computer = worker.builderCpu("amd cpu")
                .builderDisk("西数硬盘")
                .builderKeyboard("雷蛇键盘")
                .getComputer();
        System.out.println(computer);
    }
}
posted @   jpy  阅读(8)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示