当前位置: 首页 > article >正文

建造者模式(或者称为生成器(构建器)模式)

一、什么是建造者模式?

将复杂对象的构建与表示进行分离,使得统一的构建过程,可以创建出不同的对象表现模式

就是将复杂对象里面的成员变量,设置不同的值,使得生成出来的对象拥有不同的属性值;

二、特点

要解决的问题:复杂对象使用不同的构建过程,产生拥有不同对象属性的对象,调用者只需要设定不同的属性值,不需要了解属性值之间是怎么构建出来对象的;

抽象建造者:抽象创建者接口

实际建造者:抽象创建者的不同实现

产品:复杂产品

指挥者:用来与调用者交互,实现通过抽象创建者生产出产品的流程

三、角色和实现

实现方式一:

  • 抽象建造者
public interface CarBuilderInterface {

    Object builderWheel();


    Object builderFrame();

    Object builderCoreComponent();


}
  • 具体建造者
public class CarBuilderInterfaceImpl implements CarBuilderInterface {
    @Override
    public Object builderWheel() {
        System.out.println("生产了一个轮子");
        return "返回轮子";
    }

    @Override
    public Object builderFrame() {
        System.out.println("生产了一个车架");
        return "返回车架";
    }

    @Override
    public Object builderCoreComponent() {
        System.out.println("生产了核心组件");
        return "返回核心组件";
    }
}
  • 具体的产品
public class CarProduct {

    private String wheel;

    private String frame;

    private String coreComponent;

    public String getWheel() {
        return wheel;
    }

    public void setWheel(String wheel) {
        this.wheel = wheel;
    }

    public String getFrame() {
        return frame;
    }

    public void setFrame(String frame) {
        this.frame = frame;
    }

    public String getCoreComponent() {
        return coreComponent;
    }

    public void setCoreComponent(String coreComponent) {
        this.coreComponent = coreComponent;
    }
}
  • 指挥者Director:实例化建造者,通过建造者组织具体的产品
public class CarBuilderDirector {

    private CarBuilderInterface carBuilderInterface;

    public CarBuilderDirector(CarBuilderInterface carBuilderInterface) {
        this.carBuilderInterface = carBuilderInterface;
    }


    public CarProduct builderCarProduct() {
        CarProduct carProduct = new CarProduct();
        carProduct.setWheel(carBuilderInterface.builderWheel().toString());
        carProduct.setFrame(carBuilderInterface.builderFrame().toString());
        carProduct.setCoreComponent(carBuilderInterface.builderCoreComponent().toString());
        return carProduct;
    }
}
  • 当需要使用建造者模式进行对象构建时:
public class Client {

    public static void main(String[] args) {

        CarBuilderInterface carBuilderInterface = new CarBuilderInterfaceImpl();

        CarBuilderDirector carBuilderDirector = new CarBuilderDirector(carBuilderInterface);

        CarProduct carProduct = carBuilderDirector.builderCarProduct();
        System.out.println("生成了一个车:" + carProduct.getWheel() + "," + carProduct.getFrame() + "," + carProduct.getCoreComponent());
    }
}

实现方式二:使用静态内部类的方式实现


/**
 * 通过内部类的形式实现建造者模式,并且可以实现链式调用
 */
public class CarBuilderExample {

    private String wheel;

    private String frame;

    private String coreComponent;
    

    private CarBuilderExample(String wheel, String frame, String coreComponent) {
        this.wheel = wheel;
        this.frame = frame;
        this.coreComponent = coreComponent;
    }

    public static class CarBuilderExampleBuilder {
        private String wheel;

        private String frame;

        private String coreComponent;

        public static CarBuilderExampleBuilder builder() {
            return new CarBuilderExampleBuilder();
        }

        public CarBuilderExampleBuilder wheel(String wheel) {
            this.wheel = wheel;
            return this;
        }

        public CarBuilderExampleBuilder frame(String frame) {
            this.frame = frame;
            return this;
        }

        public CarBuilderExampleBuilder coreComponent(String coreComponent) {
            this.coreComponent = coreComponent;
            return this;
        }

        public CarBuilderExample builderExample() {
            return new CarBuilderExample(wheel, frame, coreComponent);
        }

    }

    public static void main(String[] args) {
        CarBuilderExampleBuilder builder = CarBuilderExampleBuilder.builder();
        CarBuilderExample carBuilderExample = builder
                .wheel("轮子")
                .frame("车架+")
                .coreComponent("核心部件+").builderExample();
        System.out.println(carBuilderExample.coreComponent + carBuilderExample.frame + carBuilderExample.wheel);
    }

}
lombok包里面的@Builder也是通过这种模式实现的

四、与工厂方法和抽象工厂之间的区别

工厂是指创建一个类型的多种实现

抽象工厂是指创建一系列类型的多种实现


http://www.kler.cn/a/506633.html

相关文章:

  • Ubuntu20.4和docker终端指令、安装Go环境、安装搜狗输入法、安装WPS2019:保姆级图文详解
  • 【Flink系列】4. Flink运行时架构
  • 什么是基础镜像
  • 【机器学习:二十二、机器学习项目开发的技巧】
  • SpringBoot之OriginTrackedPropertiesLoader类源码学习
  • IOS工程师
  • Web3如何赋能元宇宙中的数字身份与隐私保护
  • 28、【OS】【Nuttx】最小系统初始化分析(4):定时器(二)
  • word合并
  • Redisson发布订阅学习
  • (蓝桥杯)二维数组前缀和典型例题——子矩阵求和
  • 深入理解 Entity、VO、QO、DTO 的区别及其在 MVC 架构中的应用
  • C# 根据name查找并返回winform菜单栏(MenuStrip)、工具栏(ToolStrip)中的子控件来修改属性
  • 3D高斯在自动驾驶中的应用
  • Oracle系列---【ORA-01017用户名密码无效】
  • 合合信息名片全能王上架原生鸿蒙应用市场,成为首批数字名片类应用
  • 深度学习电影推荐-CNN算法
  • 【深度学习地学应用|滑坡制图、变化检测、多目标域适应、感知学习、深度学习】跨域大尺度遥感影像滑坡制图方法:基于原型引导的领域感知渐进表示学习(四)
  • H3CNE-11-生成树协议STP
  • elasticsearch线程池配置
  • Profibus DP转Modbus TCP协议转换网关模块功能详解
  • 图形验证码是怎样保护登录安全的?
  • 【JVM-4】深入解析JVM垃圾回收算法:原理、实现与优化
  • Golang学习笔记_26——通道
  • 【C++】size_t全面解析与深入拓展
  • ‌如何有效学习PyTorch:从基础到实践的全面指南‌