设计模式-----Builder模式

设计模式-抽象工厂和builder模式 一、序言 系列博客文章都是研读Gof的Design Patterns这本书的总结分享,书上的有些例子代码不是很全,这边依葫芦画瓢还原了一些代码,可供运行。目前,网络上很多分享设计模式内容的博客文章,都很经典,其中有个优快云中的设计模式博客专栏也是研究的Gof的书籍,通俗易懂,让读者对设计模式一目了然。 自己在学习设计模式的过程中,有时候理解一个设计模式挺简单的,但是想要记住它,运用它, 阅读详情

1、什么是Builder模式?
(1)对于复杂的对象,如果只是用构造方法创建的话,构造方法中会存在很多的逻辑,那么我们可以一步步有秩序构建它,从而降低复杂度;
(2)对于复杂的对象,使用者不必知道其内部是如何实现的清下,逐步构造需要的实例对象;
2、什么情况下使用Builder模式?
  (1)将一个复杂对象的构建与它的表示分离,即相同的构造过程可以有不同表示;
  (2)当有多个构造器且需要传入不同的参数表示不同的产品时(即可以弥补工厂模式等无法选择多参数的缺点)
  (3)传入参数情况比较灵活且复杂的情况,或者说一开始不需要明确参数的情况。
  (4)框架中很多Configuration配置都会用到Builder模式。
3、具体使用Builder例子
(1)以前经常通过不同构造器传入不同的参数构造不同复杂的对象,比如我们现在需要一个User的不同情况对象

  • 只有id和name
  • 有id、name、age
  • 有id、name、age、address
public class User {
    private int id;
    private String name;
    private int age;
    private String address;
    
    //不同的构造器传入不同的参数,创造不同的复杂的产品
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public User(int id, String name, int age, String address) {
        this.id = id;
        this.name = name;
        this.age= age;
        this.address = address;
    }
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

测试类这样编写:

public class Main {
    public static void main(String[] args) {
        //情况1:id、姓名
        User user = new User(1, "Zhangsan");
        //情况2:id、姓名、年龄
        User user2 = new User(2,"Lisi",22);
        //情况3:id、姓名、年龄、地址
        User user3 = new User(3,"Wangwu",23,"Beijing");
        //情况4:id与年龄不清楚,很容易混淆,必须得查看源码或者文档才能知道哪个参数位置id/年龄
        User user4 = new User(24,"Wangwu",24,"Beijing");
    }
}

OK,这样是没有问题的,但是会有以下弊端:

  • 就好比情况4。当传入的参数很多并且没有说明文档的情况下,之后阅读完源码后才能更好地使用。那么就有可能对源码进行修改,这样就违背了在应用中一个好的设计模块的原则,即设计模式中的开闭原则(Open-Closed Principle, OCP,对修改封闭)
  • 每种情况都得编写一个的构造器,没有一点的灵活度。再比如这里address属性是可选的,可以不传入,那么灵活度同样很低!
    (2)接下来就使用Builder模式创建,注意:Builder主要采用Java静态内部类
/**
 * 利用Builer模式灵活面对复杂对象的创建
 * @author Lijian
 *
 */
public class User2 {
    private int id;
    private String name;
    private int age;
    private String address;
    
    private User2(Builder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
    }
    static class Builder{
        private int id;
        private String name;
        private int age;
        private String address;
        //灵活选择参数
        public Builder setId(int id) {
            this.id = id;
            return this;
        }
        public Builder setName(String name) {
            this.name = name;
            return this;
        }
        public Builder setAddress(String address) {
            this.address = address;
            return this;
        }
        public Builder setAge(int age) {
            this.age = age;
            return this;
        }
        //最后build返回User2对象
        public User2 build() {
            return new User2(this);
        }
    }
}

测试类:

public class Main {
    public static void main(String[] args) {
        //通过build创建了User2对象,之后通过setXXX方法可灵活初始化属性,最后build返回对象
        User2 user = new User2.Builder().setId(1).setName("Lijian").setAge(22).build();
        //情况1:id、姓名
        User2 user2 = new User2.Builder().setId(2).setName("Zhangsan").build();
        //情况2:id、姓名、年轻、地址
        User2 user3 = new User2.Builder().setId(2).setName("Lisi").build();
        //情况3:id与age很明显能区分
        User2 user4 = new User2.Builder().setId(23).setAge(23).build();
    }
}

通过setXXX()方法灵活选择参数,最后build()方法“闭合”返回对象。很适用于复杂对象的创建,此处让我想起Java8新特性中的Stream API的一个特点:懒加载。是的,有点“懒加载”的味道,不需要立马指定属性,也不会立马生效,之后最后的操作build()才会生效!

了解更多java知识,加qq群免费获得java进阶学习资料,QQ群:1007476384

【设计模式】builder 创建者设计模式详解(包含电商应用场景及代码示例) 在常见的设计模式中,“Builder” 通常是指一种设计模式,而不是具体的类或方法。Builder 模式是一种创建型设计模式,其目的是通过提供一个独立的构建器类来构建一个复杂对象。建造者模式(Builder Pattern) 是一种创建型设计模式,它的主要目标是为了将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。// 订单对象// 构造方法私有化,通过建造者来构建对象// 提供获取订单信息的方法// ...// 订单项对象// 构造方法。 阅读详情

相关推荐

【设计模式】Builder设计模式详解

Builder模式是一种创建型设计模式,用于将一个复杂对象的构建过程与它的表示分离。通过Builder模式,客户端可以一步一步地创建对象,且无需关心内部的创建细节。这种模式特别适用于创建需要很多步骤或者多个构造函数参数的对象。Builder模式的核心思想是将构建复杂对象的过程封装到一个对象中,而不是将这些逻辑暴露给客户端。通过使用Builder模式,客户端可以逐步构建对象,并且在不影响构建过程的情况下,改变对象的内部表示。

Programming Talk 876

Java设计模式实战-Builder

1.使用场景Builder模式主要用于复杂对象(构造方法的参数过多)的创建、对象构造参数可选配置、创建不可变对象。实际开发多用于开源框架中配置对象的创建。详见 3.范例演示 下面首先介绍为啥要用Builder模式创建对象? >>使用共有构造方法的问题: 不能灵活控制可选构造参数,使用包含所有参数的构造方法,不需要的参数也必须传,同时容易出现参数错位,不很容易发现。(构造方法重载可解决) 通过重载

Myron_007的博客 2180

基于OpenSSL的CA建立及证书签发(签发多域名/IP)

自签SSL证书(多域名/IP) 本文基于以下环境: 内核信息:Linux zabbix 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 系统版本:CentOS Linux release 7.6.1810 (Core) OpenSSL版本:OpenSSL 1.0.2k-fips 26 Jan 2017 【前言】 在基于OpenSSL的CA建立及证书签发一文中(后面统.

hobby云说 4647

JAVA中实现.builder().build()给字段赋值

在字段多的时候可以使用@Builder赋值,如果字段多使用NEW关键字在一些业务场景中每个字段都要set有时候还是挺烦人的。字段少的话还是使用NEW关键字吧。

qq_44705845的博客 5192

grafana使用方法

1、点击仪表盘2、新建仪表盘3、选择数据源4、选择查询的条件5、美化。

2403_87359664的博客 323

压电传感器信号放大难题?用运放设计电荷放大器的5个关键步骤

本文详细解析了压电传感器信号放大难题,并提供了用运放设计电荷放大器的5个关键步骤。从电压放大到电荷放大的范式转换,到运放选型、反馈网络设计、PCB布局及频响特性验证,帮助工程师解决工业自动化中的信号衰减问题,提升测量精度和稳定性。

weixin_27303545的博客 449

(一)Java常用设计模式之——Builder(建造者模式)

建造者模式的目的就是将复杂的对象的构造与表示过程分离,以便相同的构造过程可以创建不同的表示。 单纯这样讲可能比较难懂,直接来看下面的例子。 现在有一个people类,由name, gender, region 三个参数,不同people的这几个的值是不一样的。如果不使用builder模式。那么很可能在创建很多对象的时候代码量很多且冗余,而且假如想要创建一个region都是上海的人们,那么就要在每创建一次对象的时候赋值一次,十分不灵活,但是如果使用builder模式,这些问题就都可以得到解决。 下面是一个bu

qq_41381957的博客 2494

算法竞赛推荐书单

前言 入坑算法竞赛已经一年半了,在这期间也读了不少关于算法竞赛的书,这些书对我的帮助还是蛮大的。平时看题解多是个人零散的题解,很难以系统的去学习,认认真真的挑选1-2本书来阅读,无论是从思维能力还是文字表达能力都会得到提升,以下都是我自己读过的书进行一下分享,难度由浅入深,部分书籍浅尝而止。 入门:《啊哈!算法》 适合:总题量150以下初步掌握C语言的萌新 一本充满智慧和趣味的算法入门书。没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点,通过幽默的语言配以可爱的插图来讲解算法。你更像是在阅读一个个轻松

TGX的博客 8241

Builder模式

Builder模式Builder模式要解决的问题是把对象的构建和对象的表示分开来。当对象复杂的时候我,我们可以一步步来构建对象,在每一步的构建过程中,可以引入参数,通过不同的参数,即使经过相同的步骤最后可以得到不同的对象。通过一个实例来说明,Product是我们要构建的对象,在Builder类中构建,通过BuildPartA、BuildPartB、BuildPartC三步来构建对象,一个Concre

KangRoger的专栏 1628

详解ReID的各部分组成及Trick——基于FastReID

这一系列博客将基于京东开源的FastReID进行扩充,详细介绍了ReID的各个组成部分,一些有用的Trick,评价指标,常用数据集等,详细内容见下方的链接,总结不易,如有理解不正确之处,麻烦各位批评指正。 一、FastReID的中的baseline文件配置 二、Training strategy 三、Pre-processing 四、Backbone 五、Aggregation 六、Head 七、Loss 八、Distance Metric 九、Post-processing 十、Evaluation 十一

藏晖的博客 9164

2025华为od机试真题B卷【版本管理】JavaScript实现

在 软件版本管理中,版本号由点分割的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号个数。这里的可用版本号指的是所有满足 version1<x<version2的版本号x的个数。若 version1 >=version2 返回0.,

MISAYAONE的博客 254

java中的build类,Java Stream.Builder中的build()方法

build()Stream.Builder类中的方法用于构建流。它返回构建的流。语法如下:Streamlbuild()为Java中的Stream.Builder类导入以下包:importjava.util.stream.Stream;声明一个Stream.Builder:Stream.Builderbuilder=Stream.builder();在流中添加一些元素:builder.ad...

weixin_39708502的博客 3454

详解YOLOv5网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署

本文给大家带来的教程是利用YOLOv5训练自己的数据集,以及有关YOLOv5的网络结构讲解/数据集获取/环境搭建/训练/推理/验证/导出/部署相关的教程,同时通过示例的方式让大家来了解具体的操作流程,过程中还分享给大家一些好用的资源,我还对其中的参数进行了详细的讲解,通过本文大家可以成功训练自己的数据集,在开始之前给大家推荐一下我的YOLOv5专栏,本专栏包含上百种YOLOv5的改进机制以及如何撰写论文的教程,手把手教大家如何改进YOLOv5非常适合科研小白。

Snu77的博客 4900

Java 设计模式 --- Builder模式 Java Builder 模式

Java 设计模式 --- Builder模式 Java Builder 模式 一、Builder模式 1、builder模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,使用者可以一步一步的构建一个比较复杂的对象。 2、有一个User类如下: public class User { private String id ; private String name ; private Integer age ; // ig...

HaHa_Sir的博客 2万+

Bev算法在J5平台的部署

支持多种形式的Bev算法:ipmlss时序,以及基于transformer的gkt。

@bangbang的博客 846

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

设计模式之Builder模式

将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示原谅我这个定义读了好几遍也没有完全读明白什么意思。

Cinderella_wlw的博客 431

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java Builder模式(设计模式之Builder模式)

1.设计模式之终极结合 昨天项目上线(今年是没有新需求了,那提前祝大家新年快乐),上班继续最近几期博客的编写。承接上一篇博客观察者模式,这一期我们一起来了解一下Builder模式。我们最近几期博客打算主要讲一下单例模式、观察者模式、Build模式,目的是为了方便后期为大家带来RXJava+Retrofit2.0+Okhttp3结合使用的网络请求框架。 思考了一上午,我该怎么写出Builder模...

IBM_Forever 4万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

23种设计模式之Builder设计模式

23种设计模式之Builder设计模式 概述 建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。 本质 分离了对象子组件的单独构造(由Builder来单独负责)和装配(由Director来负责)...

Startapi的博客 277

Java 设计模式 - Builder

Java Design Partterns - Builder

qq_37813031的博客 787

java builder设计模式_java的设计模式 - Builder模式

Builder 模式的目的?构造对象的方式过于复杂,不如将之抽离出来。比如,构造器参数过多这样说也有点抽象,举个例子吧。举个例子因为它的属性比较多,所以构造函数也是挺吓人的。我看到也不太想调用。如果现在要构造一条消息投递模式(delivery mode)为 2优先级(priority)是 2content-type 为 text/plain在没有 builder 模式之前,是这样构造的new AM...

weixin_39696197的博客 206

Java设计模式之builder模式

Java设计模式之builder模式 今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成的。再次整理一下什么是builder模式以及应用场景。 1. builder简介 builder模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,使用者可以一步一步的构建一个比较复杂的对象。 2. 代码实例 我们通常构造一个有很多参...

WangJun的专栏 208

精讲设计模式-Builder模式

精讲设计模式- Builder模式

咸鱼弟的博客 1298

设计模式之Builder

Builder设计模式解决了传统构造方法在创建复杂对象时的三大痛点:1)避免构造器重载臃肿问题,通过链式调用按需设置属性;2)消除参数顺序记忆负担,每个属性通过独立方法设置;3)内置参数校验机制,确保对象创建时就符合业务规则。该模式将对象构建过程与表示分离,通过Builder类逐步构建,最终调用build()方法生成不可变对象。相比@Builder注解,手动实现Builder可以集成业务校验逻辑(如邮箱格式、手机号验证等),既保证了代码简洁性,又确保了对象创建时的安全性,特别适用于包含大量可选参数的复杂对象

2403_88816570的博客 1025

秒懂设计模式之建造者模式(Builder pattern)

前言 人IT江湖飘,不懂设计模式咋装逼? 没实际写过5万行代码谈设计模式都是在瞎扯淡,咱先看看这定义 In software engineering, a software design pattern is a general, reusable solution to a commonly occurring problem within a given context in softwar...

ShuSheng007的程序人生 6586

Builder 设计模式

Builder 模式通过将对象的创建过程步骤化,解决了创建复杂对象时的各种问题,提高了代码的可读性和可维护性。在实际开发中,当遇到对象创建过程复杂或者需要多种表示方式的情况时,使用 Builder 模式是一个不错的选择。

weixin_51429644的博客 943
上一篇: 如何正确使用Java序列化?
下一篇: JVM系列之Java内存结构详解
Java_No2
博客等级 码龄7年 20粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值