创建型设计模式-建造者模式应用介绍

DBC 694 0
  • 建造者模式(Builder Pattern)
    • 使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
    • 允许用户只通过指定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节
  • 场景举例
    • KFC创建套餐:套餐是一个复杂对象,它一般包含主食如汉堡、烤翅等和饮料 如果汁、 可乐等组成部分,不同的套餐有不同的组合,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐

电脑有低配、高配,组装需要CPU、内存、电源、硬盘、主板等

创建型设计模式-建造者模式应用介绍插图

  • 核心组成
    • Builder:抽象建造者,定义多个通用方法和构建方法
    • ConcreteBuilder:具体建造者,可以有多个
    • Director:指挥者,控制整个组合过程,将需求交给建造者,由建造者去创建对象
    • Product:产品角色
编码实践(同个设计模式 包括博文、书籍等不会完全相同,大体思想一致就行)老规矩,先看结构图
创建型设计模式-建造者模式应用介绍插图2
public class Main {
    public static void main(String[] args) {
        Director director = new Director();

        Computer lowComputer = director.craete(new LowComputerBuilder());

        Computer highComputer = director.craete(new HighComputerBuilder());


        System.out.println(lowComputer.toString());

        System.out.println(highComputer.toString());



    }
}
/**
 * 声明了建造者的公共方法
 */
public interface Builder {

    /**
     *细节方法
     */
    void buildCpu();

    void buildMainboard();

    void buildDisk();

    void buildPower();

    void buildMemory();

    Computer createComputer();

}
public class Computer {

    private String cpu;

    private String memory;

    private String mainboard;

    private String disk;

    private String power;


    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                ", disk='" + disk + '\'' +
                ", power='" + power + '\'' +
                '}';
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getMainboard() {
        return mainboard;
    }

    public void setMainboard(String mainboard) {
        this.mainboard = mainboard;
    }

    public String getDisk() {
        return disk;
    }

    public void setDisk(String disk) {
        this.disk = disk;
    }

    public String getPower() {
        return power;
    }

    public void setPower(String power) {
        this.power = power;
    }
}
/**
 *
 *
 * @Description 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程
 *               Director是全程指导组装过程,具体的细节还是builder去操作
 **/

public class Director {

    public Computer craete(Builder builder){

        builder.buildMemory();
        builder.buildCpu();
        builder.buildMainboard();
        builder.buildDisk();
        builder.buildPower();

        return builder.createComputer();

    }

}
/**
 * @Description 具体的建造者,实现builder来创建不同的产品
 **/

public class HighComputerBuilder implements Builder{

    private Computer computer = new Computer();

    @Override
    public void buildCpu() {
        computer.setCpu("高配 CPU");
    }

    @Override
    public void buildMainboard() {
        computer.setMainboard("高配 主板");
    }

    @Override
    public void buildDisk() {
        computer.setDisk("高配 磁盘");
    }

    @Override
    public void buildPower() {
        computer.setPower("高配 电源");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("高配 内存");
    }

    @Override
    public Computer createComputer() {
        return computer;
    }
}
/**
* @Description 具体的建造者,实现builder来创建不同的产品
**/

public class LowComputerBuilder implements Builder{

private Computer computer = new Computer();

@Override
public void buildCpu() {
computer.setCpu("低配 CPU");
}

@Override
public void buildMainboard() {
computer.setMainboard("低配 主板");
}

@Override
public void buildDisk() {
computer.setDisk("低配 磁盘");
}

@Override
public void buildPower() {
computer.setPower("低配 电源");
}

@Override
public void buildMemory() {
computer.setMemory("低配 内存");
}

@Override
public Computer createComputer() {
return computer;
}
}
控制台输出创建型设计模式-建造者模式应用介绍插图4
  • 优点
    • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
    • 每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细地控制产品的创建过程
    • 增加新的具体建造者无须修改原有类库的代码,符合开闭原则
    • 建造者模式结合链式编程来使用,代码上更加美观
  • 缺点
    • 建造者模式所创建的产品一般具有较多的共同点,如果产品差异大则不建议使用

     

  • JDK里面的应用
    • tcp传输协议 protobuf 生成的api、java中的StringBuilder(不完全一样,思想一样)

     

  • 建造者模式与抽象工厂模式的比较:
    • 建造者模式返回一个组装好的完整产品 , 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族

发表评论 取消回复
表情 图片 链接 代码

分享