建造者模式详解

建造者模式详解

1.1 建造者模式概述

1.1.1 定义

建造者模式(Builder Pattern)将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型设计模式。

  • 构建与表示分离:构建代表对象创建,表示代表对象行为、方法,也就是将对象的创建与行为分离。
  • 创建不同的表示:也就是具备同样的行为,但是由于构建的行为顺序不同或其他原因可以创建出不同的表示。

1.1.2 应用场景

  • 相同的方法,不同的执行顺序,产生不同的结果
  • 多种不同变量,组装到一个对象,产生的结果不相同
  • 不同的调用顺序会产生不同的作用
  • 初始化对象过程复杂并且很多参数有默认值

1.2 建造者模式的通用写法

package org.example.builder;

import org.example.prototype.Person;

public interface IBuilder {
    Person builder();
}
package org.example.builder;

import org.example.prototype.Person;

public class ConcreateBuilder implements IBuilder{

    private Person person =new Person();
    @Override
    public Person builder() {
        return person;
    }
}

建造者模式详解
建造者模式主要包含4个角色:
  • 需要创建的对象
  • 抽象建造者
  • 具体建造者
  • 调用者

2.1建造者模式结局实际问题

2.2.1建造者模式的链式写法

package org.example.builder;

import lombok.Data;

@Data
public class Car {
    // 发动机
    private String engine;

    private String wheel;

    private String skeleton;
}
package org.example.builder;

public class CarBuilder {

    private Car car = new Car();

    public CarBuilder buildWheel(String wheel) {
        car.setWheel(wheel);
        return this;
    }

    public CarBuilder buildEngine(String engine) {
        car.setEngine(engine);
        return this;
    }

    public CarBuilder buildSkeleton(String skeleton) {
        car.setSkeleton(skeleton);
        return this;
    }

    public Car buildCar() {
        return car;
    }
}

package org.example.builder;

public class BuilderTest {
    public static void main(String[] args) {
        Car car = new CarBuilder().buildWheel("米其林静音胎")
                .buildEngine("2.0T")
                .buildSkeleton("铝合金")
                .buildCar();
    }
}

这种链式的写法是比较常用的,我们经常会在使用JDK的类或者框架源码中看到。
再介绍另一种写法,静态内部类方式对builder进行封装:

package org.example.builder;

import lombok.Data;

@Data
public class Car {
    // 发动机
    private String engine;

    private String wheel;

    private String skeleton;

    public static class Builder{
        private Car car = new Car();

        public Builder buildWheel(String wheel) {
            car.setWheel(wheel);
            return this;
        }

        public Builder buildEngine(String engine) {
            car.setEngine(engine);
            return this;
        }

        public Builder buildSkeleton(String skeleton) {
            car.setSkeleton(skeleton);
            return this;
        }

        public Car buildCar() {
            return car;
        }
    }
}

这样的写法使产品和创建之间的联系更紧密,结构更紧凑,便于维护。

3.1 建造者模式在框架源码中的应用

3.1.1 在JDK源码中的应用

  • StringBuilder
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
.....

    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
    public StringBuilder append(StringBuffer sb) {
        super.append(sb);
        return this;
    }

可以看到append方法是标准的链式写法。

3.1.2 建造者模式在Spring源码中的应用

  • BeanDefinitionBuilder
    建造者模式详解

4.1 建造者模式扩展

4.1.1 建造者模式与工厂模式的区别

  • 建造者模式更注重方法的调用顺序,组装的方式会影响创建出来的对象的不同,而工厂模式创建出来的对象都一样。
  • 关注点不一样,建造者模式需要知道对象是由哪些部件组成,工厂模式不需要知道细节。

4.1.2 优缺点

优点:

  • 封装性好,构建和表示分离
  • 扩展性好,建造类之间独立,在一定程度上解耦
  • 将复杂对象拆分,便于控制细节
    缺点
  • 代码复杂度增加
  • 如果产品内部发生变化,建造者需同步修改,增加了一定的维护成本

Original: https://www.cnblogs.com/amazing-yml/p/15985339.html
Author: amazing_yml
Title: 建造者模式详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579002/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JDBC:(java database Connection) java数据库连接。

    JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库。 JDBC连接步骤: 1.先导入jar包,把j…

    Java 2023年6月5日
    086
  • GUI编程

    简介 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 GUI的核心技术: Swing A…

    Java 2023年6月5日
    097
  • iphone 开发学习笔记六

    结束了选择开发平台的思想斗争,最终选择MonoTouch. 最终的代码需要在iphone上测试,尽管可以使用iphone模拟器来开发,但模拟器和16实际的手机还是有很大的区别的。内…

    Java 2023年5月29日
    073
  • SpringBoot如何使用WebSocket实现前后端交互

    我们都知道http协议只能在浏览器单方面向服务器发起请求时获得响应,然而服务器不能主动向浏览器推送消息,想要实现浏览器的主动推送目前有两种主流的实现方式: 轮询:缺点很多,但是实现…

    Java 2023年5月30日
    065
  • Netty-如何写一个Http服务器

    前言 动机 最近在学习Netty框架,发现Netty是支持Http协议的。加上以前看过Spring-MVC的源码,就想着二者能不能结合一下,整一个简易的web框架(PS:其实不是整…

    Java 2023年6月16日
    0112
  • springboot禁用模板缓存,无需重新启动项目即可刷新页面

    1、在application配置文件加入 2、之后每次修改页面只需按ctrl+F9即可刷新页面,无需重新启动编译 Original: https://www.cnblogs.com…

    Java 2023年6月7日
    081
  • CSharp: Prototype Pattern in donet core 3

    调用: 输出: Original: https://www.cnblogs.com/geovindu/p/16750695.htmlAuthor: ®Geovin Du Dream…

    Java 2023年6月16日
    068
  • JavaSE进阶——课程笔记

    Loading 多动手,多思考,变量和方法写注释!!! 面向对象进阶(static、单例、代码块、继承) 1.static修饰静态成员变量及其内存原理 1)作用 2)成员变量的类型…

    Java 2023年6月6日
    086
  • 分析 java.util.LinkedHashMap

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    071
  • 理解:语法树,短语,直接短语,句柄

    概念: 语法树求短语、简单短语和句柄: 1)短语:子树的末端结点形成的符号串。 2)简单子树:只有一层分支的子树。 3)直接短语(简单短语):简单子树的末端结点形成的符号串。 4)…

    Java 2023年6月7日
    081
  • NLP学习 资料总结

    NLP目前应用于7个重要领域:1.句法语义分析:对于给定的句子,进行分词、词性标记、命名实体识别和链接、句法分析、语义角色识别和多义词消歧。2.信息抽取:从给定文本中抽取重要信息。…

    Java 2023年6月8日
    0100
  • 关于计算两日期之间经过多少天的超巧妙算法

    首先声明:本文引自一博主原创博客 昨天呢,刚刚阅读了这个代码,大部分都还可以看懂,有一两个地方属实难懂,但细细思来,方知博主此代码超神奇。简直巧妙至极。 所以来细细解析一下此代码。…

    Java 2023年6月5日
    077
  • [javaweb]重点总结大全

    javaweb web:网页静态web:html,css 数据不会发生变化动态web:servlet/jsp,asp,php每个人在不同的时间看到数据都不同 web应用程序编写完毕…

    Java 2023年6月6日
    064
  • 并发编程之:Atomic

    大家好,我是小黑,一个在互联网苟且偷生的农民工。 在开始讲今天的内容之前,先问一个问题,使用int类型做加减操作是不是线程安全的呢?比如 i++ ,++i,i=i+1这样的操作在并…

    Java 2023年6月7日
    075
  • 老徐和阿珍的故事:CAP是什么?超级爱放P吗?

    人物背景:老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。阿珍,女…

    Java 2023年6月7日
    071
  • Java-异常初步练习

    案例一: package com.esandinfo; /** * 自定义一个Exception类 */ class MyCustomException extends Runti…

    Java 2023年5月29日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球