Java设计模式-建造者模式(原型设计模式)

简介

1、使⽤多个简单的对象⼀步⼀步构建成⼀个复杂的对象,将⼀个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
2、允许⽤户只通过指定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节

场景举例

1KFC创建套餐:套餐是⼀个复杂对象,它⼀般包含主⻝如汉堡、烤翅等和饮料 如果汁、 可乐等组成部分,不同的套餐有不同的组合,⽽KFC的服务员可以根据顾客的要求,⼀步⼀步装配这些组成部分,构造⼀份完整的套餐
2、电脑有低配、⾼配,组装需要CPU、内存、电源、硬盘、主板等

图示

在这里插入图片描述

核心组成

Builder:抽象建造者,定义多个通⽤⽅法和构建⽅法
ConcreteBuilder:具体建造者,可以有多个
Director:指挥者,控制整个组合过程,将需求交给建造者,由建造者去创建对象
Product:产品⻆⾊

demo

编码实践(同个设计模式 包括博⽂、书籍等不会完全相同,⼤体思想⼀致就⾏)
以建造电脑举例
创建Builder

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

    /**
     *细节方法 创建电脑的零件
     */
    void buildCpu();

    void buildMainboard();

    void buildDisk();

    void buildPower();

    void buildMemory();

    Computer createComputer();

}

创建ConcreteBuilder1

/**
 * 具体的建造者,实现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;
    }
}

创建ConcreteBuilder2

/**
 * 具体的建造者,实现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;
    }
}

创建Director

/**
 * 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,控制产品生产过程
 * Director是全程指导组装过程,具体的细节还是builder去操作
 **/

public class Director {
    
    
    public Computer craete(Builder builder){
    
    
        builder.buildMemory();
        builder.buildCpu();
        builder.buildMainboard();
        builder.buildDisk();
        builder.buildPower();
        return builder.createComputer();
    }
}

测试demo

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());

    }
}

结果展示

Computer{
    
    cpu='低配 CPU',memory='低配 内存',mainboard='低配 主板',disk='低配 磁盘',power='低配 电源'}
Computertcpu={
    
    '高配 CPU',memory='高配 内存',mainboard='高配 主板'disk='高配 磁盘',power='高配 电源'}

优缺点
优点

1、客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
2、每⼀个具体建造者都相对独⽴,⽽与其他的具体建造者⽆关,更加精细地控制产品的创建过程
3、增加新的具体建造者⽆须修改原有类库的代码,符合开闭原则
4、建造者模式结合链式编程来使⽤,代码上更加美观

缺点

建造者模式所创建的产品⼀般具有较多的共同点,如果产品差异⼤则不建议使⽤

JDK⾥⾯的应⽤

tcp传输协议 protobuf ⽣成的api、java中的StringBuilder(不完全⼀样,思想⼀样)

建造者模式与抽象⼯⼚模式的⽐较

建造者模式返回⼀个组装好的完整产品 , 抽象⼯⼚模式返回⼀系列相关的产品,这些产品位于不同的产品等级结构,构成了⼀个产品族

猜你喜欢

转载自blog.csdn.net/csdn_mycsdn/article/details/129228823