建造者模式

建造者模式

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 @ 2021-12-13 15:38  jpy  阅读(16)  评论(0)    收藏  举报