构造者模式多种实现方式

news2024/11/18 3:20:07

构造者模式

构造者模式建议将对象构造代码从产品类中抽取出来, 并将其放在一个名为构造者的独立对象中

​ 构建者模式也是用来创建对象,但是相对于工厂模式来说,建造者模式适用于构建复杂对象,而工厂模式适用于创建对象的封装和管理,也就是说,构建者模式可以根据个人需求创建对象,根据个人需求决定对对象的某个属性是否进行赋值,以及对对象的某个属性进行不同的赋值,这是和工厂的主要区别

​ 构建者主要分为以下几个对象:

  • 抽象构造者(Builder)
package com.lhl.build;

/**
 * 抽象构造者
 * @author Liu Hanlin
 * @create 2024-09-22 23:47
 */
public abstract class Builder {

    // 创建产品
    protected Product product = new Product();

    /**
     * 构建相同部分
     */
    public void buildCommon(){
        this.product.setCommon("构造器设置公共部分");
    }

    /** 可变构造部分 */
    public abstract void buildA();
    public abstract void buildB();

    // 返回对象实例
    public Product getInstance(){
        return this.product;
    }

}

  • 具体构造者(ConcreteBuilder)

    • 带指挥者的具体构造者
    package com.lhl.build;
    
    /**
     * 具体构造者
     * @author Liu Hanlin
     * @create 2024-09-22 23:49
     */
    public class ConcreteBuilder extends Builder{
        @Override
        public void buildA() {
            this.product.setPartA("构造器设置部分A");
        }
    
        @Override
        public void buildB() {
            this.product.setPartB("构造器设置部分B");
        }
    }
    
    • 不带指挥者的具体构造者,设置完产品的属性后,继续返回此构造者
    package com.lhl.chainbuild.build;
    
    /**
     * 具体构造者
     * @author 刘翰林
     * @create 2024-09-22 23:49
     */
    public class ChainBuilder extends Builder {
        @Override
        public Builder buildA() {
            this.product.setPartA("构造器设置部分A");
            return this;
        }
    
        @Override
        public Builder buildB() {
            this.product.setPartB("构造器设置部分B");
            return this;
        }
    }
    
    
  • 产品(Product)

package com.lhl.build;

/**
 * 产品
 * @author Liu Hanlin
 * @create 2024-09-22 23:47
 */
public class Product {

    /** 产品公共部分 */
    private String common;

    /** 产品部分A */
    private String partA;

    /** 产品部分B */
    private String partB;

    @Override
    public String toString() {
        return "Product{" +
                "common='" + common + '\'' +
                ", partA='" + partA + '\'' +
                ", partB='" + partB + '\'' +
                '}';
    }

    public String getPartA() {
        return partA;
    }

    public void setPartA(String partA) {
        this.partA = partA;
    }

    public String getCommon() {
        return common;
    }

    public void setCommon(String common) {
        this.common = common;
    }

    public String getPartB() {
        return partB;
    }

    public void setPartB(String partB) {
        this.partB = partB;
    }
}

  • 指挥者(Director)【可有可无】
package com.lhl.build;

/**
 * 指挥者【不是必须的,可以由我们自己来充当指挥者】
 * @author Liu Hanlin
 * @create 2024-09-22 23:47
 */
public class Director {
    private Builder builder;

    public Director(Builder builder){
        this.builder = builder;
    }

    public Director(){
    }

    public void setBuilder(Builder builder){
        this.builder = builder;
    }

    /**
     * 组装产品返回
     * @return
     */
    public Product Construct(){
        this.builder.buildCommon();
        this.builder.buildA();
        this.builder.buildB();

        return this.builder.getInstance();
    }
}

​ 如上,我们就完成了构造者模式的带指挥者和不带指挥者的两种类型,我们现在可以进行测试一下

package com.lhl;

import com.lhl.build.ConcreteBuilder;
import com.lhl.build.Director;
import com.lhl.build.Product;
import com.lhl.chainbuild.build.Builder;
import com.lhl.chainbuild.build.ChainBuilder;

/**
 * 构建者模式
 * @author 刘翰林
 * @create 2024-09-20 0:46
 */
public class Main {
    public static void main(String[] args) {

        System.out.println("有指挥者:");
        buildDemo();
        System.out.println("*******************************");
        System.out.println("无指挥者:");
        chainBuildDemo();
    }

    /**
     * 构造者模式链式调用【无指挥者,指挥权交给客户端】构建示例
     */
    public static void chainBuildDemo(){
        Builder builder = new ChainBuilder();
        com.lhl.chainbuild.build.Product instance = builder.buildCommon()
                .buildA()
                .buildB()
                .getInstance();

        System.out.println(instance);
    }

    /**
     * 有指挥者对象的构造器模式示例
     */
    public static void buildDemo(){
        Director director = new Director(new ConcreteBuilder());
        Product construct = director.Construct();

        System.out.println(construct);
    }
}

输出结果如下:可以看到都是可以正常使用的

在这里插入图片描述
此外,值得注意的是,我们在导入了Lombok依赖后,可以直接使用@Builder注解帮助我们创建此类的构造者

具体示例如下:

  • 导入Lombok依赖
<!-- Lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version> <!-- Use the latest version available -->
    </dependency>
  • 定义产品类,给产品类添加build注解
package com.lhl.lombokbuild;

import lombok.Builder;
import lombok.Data;

/**
 * 产品
 * @author Liu Hanlin
 * @create 2024-09-22 23:47
 */
@Data
@Builder
public class Product {

    /** 产品公共部分 */
    private String common;

    /** 产品部分A */
    private String partA;

    /** 产品部分B */
    private String partB;

}
  • 添加测试方法,
public static void lombokBuildDemo(){

        ProductBuilder builder = com.lhl.lombokbuild.Product.builder();

        builder.partA("lombokA");
        builder.partB("lombokB");
        builder.common("lombokCommon");
        com.lhl.lombokbuild.Product product = builder.build();

        System.out.println(product);
    }

生成对象正常输出:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2162437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端框架的对比和选择

在当今的前端开发领域&#xff0c;有多种流行的前端框架可供选择&#xff0c;如 Vue、React 和 Angular。以下是这些框架的对比以及 Vue 的优势&#xff1a; 一、React 特点&#xff1a; 声明式编程&#xff1a;使用 JSX 语法&#xff0c;使得组件的结构和行为更加清晰。虚拟…

力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs

代码思路是受一个洛谷题解里面大佬的启发。应该算是一个dfs和回溯的入门题目&#xff0c;很好的入门题目了下面我会先给我原题解思路我想可以很快了解这个思路。下面是我自己根据力扣大佬写的。 我会进行详细讲解并配上图辅助理解大家请往下看 #include<iostream> #inc…

CentOS 安装 JAVA环境(JDK 1.8)

镜像选择 推荐国内镜像直接下载 清华镜像 https://mirrors.tuna.tsinghua.edu.cn/Adoptium 关于重命名 AdoptOpenJDK 镜像为 Adoptium 的通知 编程宝库 http://www.codebaoku.com/jdk/jdk-index.html 这个镜像站&#xff0c;包含Oracle JDK、OpenJDK、AdoptOpenJDK、阿里…

Lesson1 机器学习_基础介绍(环境配置、入门知识)

Anaconda说明 学习Python的时候&#xff0c;使用者需要耗费时间下载对应的库&#xff08;理解为Python的武器&#xff09;......一家数据公司想让Python的使用更加便利&#xff0c;于是anaconda诞生了anaconda相当于一辆运输车&#xff0c;不仅包含了Python&#xff0c;还附有P…

【Python】数据可视化之点线图

目录 散点图 气泡图 时序图 关系图 散点图 Scatterplot&#xff08;散点图&#xff09;是一种用于展示两个变量之间关系的图表类型。在散点图中&#xff0c;每个观测值&#xff08;或数据点&#xff09;都被表示为一个点&#xff0c;其中横轴&#xff08;X轴&#xff09;代…

MODELS 2024震撼续章:科技与可持续性的未来交响曲

MODELS 2024国际会议正如火如荼地进行着&#xff0c;每一天都充满了新的发现与启迪&#xff0c;每一场分享都是对技术前沿的一次深刻探索&#xff0c;更是对现实世界可持续性挑战的一次积极回应。现在让我们继续这场科技盛宴&#xff0c;看看小编为您精选几场的学术分享吧~ 会议…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第三篇-着色器光照】

在前两篇文章中&#xff0c;我们分别拆解描述了实现原理&#xff0c;并进行了基础的着色器制作。在这一篇文章中&#xff0c;我们将为它实现光照效果 简单的概述 当光线射入体积时&#xff0c;随着光线射入距离的增加&#xff0c;体积中的介质会对光线产生反射和吸收作用&…

springboot 接口接收及响应xml数据

1.实体类 import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement;XmlRootElement XmlAccessorType(XmlAccessType.FIELD) // …

gitlab添加CI自动测试

gitlab 配置 yml 语法 ** https://docs.gitlab.com/17.3/ee/ci/yaml/index.html ** 添加.gitlab-ci.yml文件并配置 &#xff1a; ## 定义几个阶段 stages: # List of stages for jobs, and their order of execution- build- test- deploy- ## 示例job &#xff0…

Linux 简易shell编写

shell shell是壳&#xff0c;外壳的意思&#xff0c;一般我们使用linux系统有用图形化界面的也有使用命令行界面的&#xff0c;这两个都是一种shell&#xff0c;以命令行为例&#xff1a; 如图这个就是我这里的命令行格式&#xff0c;在$符后面写的就是执行的指令&#xff0c;…

携手SelectDB,观测云实现性能与成本的双重飞跃

在刚刚落下帷幕的2024云栖大会上&#xff0c;观测云又一次迎来了全面革新。携手SelectDB&#xff0c;实现了技术的飞跃&#xff0c;这不仅彰显了观测云在监控观测领域的技术实力&#xff0c;也预示着我们可以为全球用户提供更加高效、稳定的数据监测与分析服务。这一技术升级&a…

同等学力英语用什么app背单词

同等学力申硕的意义和作用 授予同等学力人员硕士学位是国家为同等学力人员开辟的获得学位的渠道&#xff0c;对于在职人员业务素质的提高和干部队伍建设起到积极作用。它为那些没有传统学历背景但具有相应学术水平的人员提供了获取学位的机会&#xff0c;有助于提升他们的职业竞…

llamafactory0.9.0微调qwen2.5

llama_factory微调QWen1.5_llama factory qwen-CSDN博客文章浏览阅读2.9k次,点赞36次,收藏10次。本文介绍了如何使用LLaMA-Factory微调Qwen1.5模型,包括1.8B和0.5B版本的训练细节。在数据、训练、LORA融合及推理等方面进行了探讨,同时也分享了微调后模型在不同任务上的表现…

Linux usb主机控制器HC阅读

intel的UHCI 一种usb主机控制器的接口规范,遵守它的硬件称为UHCI主机控制器,Linux中,把这种硬件叫做HC,host controller,与之对应的软件,叫做HCD,hc driver, depends on usb & pci: 它的内核软件模块代码是uhci-hcd.c uhci_hcd_init初始化开始: usb_disable函数:…

408选择题笔记|自用|随笔记录

文章目录 B树&#xff1a;访问节点建堆&#xff01;将结点插入空堆广义指令求每个子网可容纳的主机数量虚拟内存的实现方式文件目录项FCB和文件安全性管理级别索引文件三种存取方式及适用器件成组分解访问磁盘次数 C语言标识符 最小帧长物理传输层介质 局域网&广域网考点总…

基于BeagleBone Black的网页LED控制功能(flask+gpiod)

目录 项目介绍硬件介绍项目设计开发环境功能实现控制LED外设构建Webserver 功能展示项目总结 &#x1f449; 【Funpack3-5】基于BeagleBone Black的网页LED控制功能 &#x1f449; Github: EmbeddedCamerata/BBB_led_flask_web_control 项目介绍 基于 BeagleBoard Black 开发板…

ubuntu 安裝 Poetry 示例

ubuntu 安裝 Poetry 示例 一、前言 poetry 是一个命令行工具&#xff0c;安装之后就可以使用 poetry 指令。可以将其安装全局环境或者是虚拟环境&#xff0c;我推荐安装在全局环境&#xff0c;这样在后面使用时不需要单独激活虚拟环境。 &#xff08;1&#xff09;安装 Poet…

ubuntu22.04磁盘挂载(多磁盘和单磁盘挂载)

多磁盘挂载到同一个目录 # 如果没有安装逻辑卷管理系统工具sudo apt install lvm2 # 查看磁盘分区sudo fdisk -l # 新建物理卷sudo pvcreate /dev/nvme0n1 /dev/nvme1n1 # 查看现有物理卷信息sudo pvdisplay # 新建物理卷sudo vgcreate dnyjy_vg /dev/nvme0n1 /dev/nvme1n1…

STM32F407之超声波模块使用

#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "HC_SR04.h"int main() {OS_ERR err;//错误uart_init(9600);//串口初始化//超声波初始化HC_SR04();//OS初始化 他是第一个运行的函…

【VUE3.0】动手做一套像素风的前端UI组件库---Message

目录 引言自己整一个UI设计稿代码编写1. 设计信息窗口基础样式2. 设置打开和关闭的方法3. 编写实例化组件的js文件4. 看下最终效果5. 组件完整代码6. 组件调用方式 总结 引言 本教程基于前端UI样式库 NES.css 的UI设计&#xff0c;自行研究复现。欢迎大家交流优化实现方法~ 此次…