Java设计模式 _创建型模式_建造者模式(Builder)

一、建造者模式

1、建造者模式(Builder Pattern)是一种创建对象的设计模式。它允许你使用不同的构建策略来创建复杂对象。通常是在复杂类中通过静态内部类(Builder)来进行构建。

2、实现思路:
(1)、创建实体类中,私有化构造方法
(2)、定义静态内部类Builder,Builder类包含和实体类相同的属性,以及每个属性的set方法,以及build()方法去调用实体的构造。
(3)、构建实例对象时,通过静态内部类Builder进行设值在build()进行实例对象的创建。

3、优点
(1)、相对于构造方法的方式,建造者模式无需关心构造方法的参数顺序。
(2)、相对于构造方法的方式,建造者模式套路更优,无需定义更多的构造方法。
(3)、创建实例的方式隐藏在内部,不会暴漏给外部,外部无法知道创建的具体过程。
(4)、创建对象的过程是链路进行设置的,相对而言,代码更灵活和可读性更好。
(5)、相对于new对象,在逐个set赋值的方式。建造者模式是先set,在new的过程。建造者可以确定对象一定存在,而前者可能存在构建失败造成空指针的问题等。

二、代码示例

代码示例:

public class Computer {
    private String cpu;
    private String gpu;
    private String ram;
    private String storage;

    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.gpu = builder.gpu;
        this.ram = builder.ram;
        this.storage = builder.storage;
    }

    @Override
    public String toString() {
        return "Computer{" + "cpu='" + cpu + '\'' + ", gpu='" + gpu + '\'' + ", ram='" + ram + '\'' +  ", storage='" + storage + '\'' +  '}';
    }

    public static class Builder {
        private String cpu;
        private String gpu;
        private String ram;
        private String storage;

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

        public Builder setGpu(String gpu) {
            this.gpu = gpu;
            return this;
        }

        public Builder setRam(String ram) {
            this.ram = ram;
            return this;
        }

        public Builder setStorage(String storage) {
            this.storage = storage;
            return this;
        }

        public Computer build() {
            return new Computer(this);
        }
    }

    public static void main(String[] args) {
        Computer computer = new Computer.Builder()
                .setCpu("CPU-i7")
                .setGpu("GPU-3080")
                .setRam("16GB")
                .setStorage("1TB")
                .build();
        System.out.println(computer);

        computer = new Computer.Builder()
                .setCpu("CPU-i11")
                .setGpu("GPU-9090")
                .setRam("32GB")
                .setStorage("2TB")
                .build();
        System.out.println(computer);
    }
}

如上的代码示例中,在静态内部类Builder中,每一个set方法中通过return this,实现了设备值的同时,返回房前Builder对象,可以继续调用set方法,进而实现了链路设置的方式。

学海无涯苦作舟!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【EI会议|稳定检索】2024年航空航天、空气动力学与自动化工程国际会议(ICAAAE 2024)

2024 International Conference on Aerospace, Aerodynamics, and Automation Engineering 一、大会信息 会议名称:2024年航空航天、空气动力学与自动化工程国际会议 会议简称:ICAAAE 2024 收录检索:提交Ei Compendex,CPCI,CNKI,Google Schol…

短袖面料有哪些种类?质量好的短袖品牌实测推荐

夏天确实是一个让人感到炎热的季节,而选择合适的短袖对于提高穿着的舒适度和避免不必要的困扰非常重要。所以为了让大家能够选到一些合适自己而且质量好短袖,今天为大家总结了几点关键的选购技巧或一些知识科普!并且结合我近期测评过的众多短…

【C++ STL序列容器】list 双向链表

文章目录 【 1. 基本原理 】【 2. list 的创建 】2.1 创建1个空的 list2.2 创建一个包含 n 个元素的 list(默认值)2.3 创建一个包含 n 个元素的 list(赋初值)2.4 通过1个 list 初始化另一个 list2.5 拷贝其他类型容器的指定元素创…

Qt : 在QTreeWidget中添加自定义右键菜单

一、引言 如图,我们需要在一个QTreeWidget 控件中添加了自定义右键菜单。 二、思路 如何做到的呢,很简单。浅浅记录和分享一下。 继承QTreeWidget,定义一个子类CustomTreeWidget ,在重写contextMenuEvent 事件即可。 三、代…

【MySQL】InnoDB与MyISAM存储引擎的区别与选择

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。 存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。我们可以在创建表的时候,来指定选择的存储引擎,如果没有指定将自动选择默认的存储引擎。…

深浅拷贝及其现代写法

#include<iostream> using namespace std; class Person { public://默认构造Person(){cout << "Person()" << endl;}//有参构造函数Person(int age,int height){m_age age;m_height new int(height);cout << "Person(int age, int h…

centos7搭建maven私服nexus

1.nexus Nexus Repository Manager&#xff08;通常简称 Nexus 或 Nexus RM&#xff09;是由Sonatype公司开发的一款开源的、强大的软件仓库管理工具&#xff0c;主要用于企业级的二进制组件&#xff08;如Java库、Node.js模块、Python包等&#xff09;存储、管理和分发。 官方…

DRF学习之三大认证

一、认证 1、自定义认证 在前面说的 APIView 中封装了三大认证&#xff0c;分别为认证、权限、频率。认证即登录认证&#xff0c;权限表示该用户是否有权限访问接口&#xff0c;频率表示用户指定时间内能访问接口的次数。整个请求最开始的也是认证。 &#xff08;1&#xff…

Unity射击游戏开发教程:(3)如何销毁游戏对象 ,添加CD

在 Unity 中销毁游戏对象 在我之前的文章中,我写了关于实例化或创建激光预制体,当发射时,激光预制件将继续在屏幕上移动一段时间。 创建所有这些激光预制件后,最终会减慢游戏速度,因此我们必须通过创建激光预制件来找到平衡,在屏幕上移动直到它超出游戏视图,然后销毁它…

【RAG 论文】Adaptive-RAG:自适应地根据 query 难度来选择合适的 RAG 模型

论文&#xff1a;Adaptive-RAG: Learning to Adapt Retrieval-Augmented Large Language Models through Question Complexity ⭐⭐⭐⭐ Code&#xff1a;github.com/starsuzi/Adaptive-RAG NAACL 2024&#xff0c;arXiv:2403.14403 文章目录 一、论文速读二、实现细节2.1 三种…

GitHub/R3D3项目环境配置踩坑记录

1、前言 项目链接地址&#xff1a;SysCV/r3d3 (github.com) 按照安装步骤容易出现的问题&#xff0c;environment.yaml文件中安装相关包&#xff0c;其中还有两个pip install githttps://github.com/..........这两个建议注释掉&#xff0c;后面再来安装这两个。 2、问题及解…

下载六佰之际暨 SDK+Plugin 升级

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 这几个版…

Qt图片等资源管理

Qt的图片等资源管理通常有两种方式 1&#xff0c;直接将图标和一些配置文件打包在可执行程序中 添加qrc文件&#xff0c;可使用qtcreator直接添加 右键选中工程 点击选择即可。 然后添加文件。我这个例子是添加了Image文件夹下的图片资源 使用的时候&#xff0c;可以在代码…

Oracle Analytics BIEE 操作方法(六)数据格式1:百分比

问题&#xff1a; 有如下公式&#xff0c;将数据显示为按行的百分比。此时数据显示只会有一位小数。想显示两位 解决方案 在分析中找到“高级”标签&#xff0c;将“分析XML”中内容复制出来 替换 将&#xff1a;minDigits“1” maxDigits“1” 替换为&#xff1a;minDigits…

在线HTML编辑器源码

在线HTML编辑器源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 index.html <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>在线HTML编辑器</title><meta name"viewport" content"…

10年交易Anzo Capital昂首资本才发现的适合孕线的止损

拥有10年交易经验的投资者才发现的一种止损方法&#xff0c;那就是Inside-bar孕线止损&#xff0c;有些投资者就有疑问了&#xff0c;止损能明白&#xff0c;但是什么是Inside-bar孕线?其实很简单&#xff0c;Anzo Capital昂首资本就先做个知识普及&#xff1a; inside-bar就…

一文读懂VR数字展览会,从沉浸式体验到市场竞争力的全方位提升

在数字化转型的浪潮中&#xff0c;VR技术正逐渐成为商业展览的新趋势。VR数字展览会通过创新的展示功能和互动体验&#xff0c;为参展商和观众带来前所未有的便利和效果。 一、VR展示功能的沉浸式体验 1、全方位沉浸式体验&#xff1a; VR技术能够创造一个全方位的三维展览环…

备考2024年上海初中生古诗文大会:单选题真题示例和独家解析

上海市中小学生的初中生古诗文大会——即上海中学生古诗文大会&#xff08;初中组&#xff09;和小学生古诗文大会&#xff08;比赛&#xff09;相比&#xff0c;除了题型更丰富之外&#xff0c;最主要的是考察的内容深度和广度不同。初中的题目中对于文言文的考察大幅增加&…

vue3+node.js+mysql+ant design实现表格的查询功能

今日主要分享如何运用vue、nodejs、mysql及ant design构建表格数据查询功能&#xff0c;这也是众多项目开发者关注的问题。最关键在于前端与后端的协作&#xff0c;后端数据则通过nodejs编写。尽管涉及多项技术&#xff0c;看似复杂&#xff0c;但实际操作却并非困难。当然&…

【Harmony3.1/4.0】笔记六-对话框

概念 对话框在任何一款应用中&#xff0c;任何一个系统或者平台上使用都非常频繁&#xff0c;这里介绍一下鸿蒙系统中对话框的用法&#xff0c;分别为:普通文本对话框&#xff0c;自定义提示对话框&#xff0c;对话框菜单&#xff0c;警告提示对话框&#xff0c;列表选择对话框…
最新文章