设计模式-创建型模式-建造者模式

news2024/11/13 10:20:53

1.建造者模式定义

      建造者模式又称生成器模式,将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示;

1.1 建造者模式优缺点

优点

  • 封装性好,主要的业务员逻辑封装在指挥者类中;
  • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同创建过程可以创建不同产品对象;
  • 更精细的控制产品的创建过程,使得创建过程更加清晰;
  • 易于扩展,当有新需求时,只需要创建新的建造者类就可以完成,符合开闭原则;

缺点

  • 建造者模式所创建产品一般具有较多共同点,当产品间差异很大,不适用于建造者模式;

1.2 建造者模式应用场景

  • 创建的对象较为复杂,由多个部件构成,各部件面临着复杂的变化,但构件间建造顺序稳定; 
  • 创建复杂对象的算法独立于该对象的组成部分以及他们的装配方式,即产品的构建过程与最终的表示是独立的;

2.建造者模式原理

  • 抽象建造者类(Builder):接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的部件对象的创建;
  • 具体建造者类(ConcreteBuilder):实现Builder接口,完成复杂产品的各个部件的具体创建方法,在构造过程完成后,提供一个方法返回创建好的负责产品对象;
  • 产品类(Product):要创建的复杂对象(包含多个组成部件);
  • 指挥者类(Director):调用具体建造者创建负载对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各个部分完整创建或按照某种顺序创建(客户端一般只需要与指挥者进行交互);

3.建造者模式实现方式

        【实例】

        生产自行车是一个复杂的过程,它包含了车架,车座等组件的生产。而车架又有碳纤维,铝合金等材质的,车座有橡胶,真皮等材质。对于自行车的生产就可以使用建造者模式。

        这里Bike是产品,包含车架,车座等组件;Builder是抽象建造者,MobikeBuilder和HelloBuilder是具体的建造者;Director是指挥者。类图如下:

        【代码】

        产品

public class Bike {

    //车架
    private String frame;

    //座椅
    private String seat;

    public String getFrame() {
        return frame;
    }

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

    public String getSeat() {
        return seat;
    }

    public void setSeat(String seat) {
        this.seat = seat;
    }
}

        构建者类

public abstract class Builder {

    protected Bike mBike = new Bike();

    public abstract void buildFrame();
    public abstract void buildSeat();
    public abstract Bike createBike();
}

public class HelloBuilder extends Builder {
    @Override
    public void buildFrame() {
        mBike.setFrame("碳纤维车架");
    }

    @Override
    public void buildSeat() {
        mBike.setSeat("橡胶车座");
    }

    @Override
    public Bike createBike() {
        return mBike;
    }
}

public class MobikeBuilder extends Builder {

    @Override
    public void buildFrame() {
        mBike.setFrame("铝合金车架");
    }

    @Override
    public void buildSeat() {
        mBike.setSeat("真皮车座");
    }

    @Override
    public Bike createBike() {
        return mBike;
    }
}

        指挥者类

public class Director {

    private Builder mBuilder;

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

    public Bike construct() {
        mBuilder.buildFrame();
        mBuilder.buildSeat();
        return mBuilder.createBike();
    }
}

        客户端

public class Client {

    public static void main(String[] args) {
        showBike(new HelloBuilder());
        showBike(new MobikeBuilder());
    }

    private static void showBike(Builder builder) {
        Director director = new Director(builder);
        Bike bike = director.construct();
        System.out.println(bike.getFrame());
        System.out.println(bike.getSeat());
    }
}

4.建造者模式创建复杂对象

        常用的创建对象方法:

  • 构造方法:参数多的时候可读性与易用性不高,容易搞错参数的顺序,导致隐蔽的bug;
  • set 方法:破环了不可变对象的密闭性;

4.1 建造者模式创建复杂对象实现

  • 目标类的构造方法要传入Builder对象;
  • Builder建造者类位于目标类内部,并使用static修饰;
  • Builder建造者对象提供内置的各种set方法,set方法返回的是builder对象本身;
  • Builder建造者类提供 build() 方法实现目标对象的创建;
public class 目标类{
	
    //目标类的构造方法需要传入Builder对象
    public 目标类(Builder builder){
        
    }

    public 返回值 业务方法(参数列表){
        
    }
    
    //Builder建造者类位于目标类内部,并且使用static修饰
    public static class Builder(){
        //Builder建造者对象提供内置的各种set方法,注意set方法返回的是builder对象本身
        private String xxx;
        public Builder setXxx(String xxx){
            this.xxx = xxx;
            return this;
        }
        
        //Builder建造者类提供build()方法实现目标对象的创建
        public 目标类 build(){
            //校验
            return new 目标类(this);
        }
    }
}

5.lombok使用建造者模式创建对象

         首先对象上添加Builder注解

@Builder
@Data
public class User {
    private String name;
    private int age;
    private String email;
}

        然后创建对象的时候就可以使用建造者创建

public static void main(String[] args) {
        User user = User.builder()
                        .setName("Alice")
                        .setAge(30)
                        .setEmail("alice@example.com")
                        .setBuild();

        设计模式感觉真的是不实践的话好难弄懂,很多操作都不知道有什么必要

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

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

相关文章

RabbitMQ练习(Work Queues)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考:《RabbitMQ练习(Hello World)》 确保RabbitMQ、Sender、Receiver容器正常安装和启动: rootk0test1:~# docker run -it --rm --…

流体中的流线【StreamLines】的实现

流线是一条线,它是 与瞬时速度方向相切(速度是一个矢量,并且 它有一个大小和一个方向)。为了在流程中可视化这一点,我们 可以想象一个小的标记流体元素的运动。例如,我们可以标记一个 用荧光染料滴水&#…

nginx和tomcat负载均衡

文章目录 一,tomcat1.tomca用途2.tomcat重要目录 二,nginx1.Nginx应用2.nginx作用3.nginx的正向代理和反向代理3.1正向代理3.2反向代理(单级)3.3反向代理(多级) 4.nginx负载均衡4.1Nginx支持的常见的分流算法1. 轮询(Round Robin):2.最少连接数(LeastCon…

OLED整体刷新到结合switch刷新方式演变

OLED整体刷新到结合switch刷新方式演变 引言 OLED刷新模式, 其实很简单, 就和prinf输出一样, 只是我们这里利用OLED来输出我们所需要的东西了。 至于OLED单独整体刷新, 还是利用switch刷新, 都是形而上学, 形的东西, 至于底层, 江协科技大佬已经帮我整理好了, 我们是站在巨人的…

[ 全部搞定 - 发票导出表格 ] PDF发票提取到表,图片发票提取到表格,扫描件发票提取到表格,全电发票PDF,全电发票扫描件识别导出EXCEL表格

最近很多朋友说找PDF发票提取Excel表格的,找到了图片识别Excel表格的,有的找图片识别Excel表格的,找到了PDF发票提取表格的,所以就很难搞,还有的说都想要 今天一篇文章,全部搞定所有发票【电子发票&#x…

运维学习————nginx3-keepalived及高可用nginx集群

目录 一、高可用nginx规划图 二、克隆一个nginx 启动测试 ​编辑 三、keepalived简介 四、安装配置keepalived保活nginx 4.1、安装 ​编辑 4.2、配置 4.2.1、主机配置(nginx1(主)配置) 4.2.2、从机配置(nginx2(主)配置)…

敏捷架构框架:数字化转型的核心驱动力

在数字化转型的浪潮中,传统的企业架构和组织结构正面临严峻挑战。为了在快速变化的市场环境中保持竞争力,企业不仅需要灵活的开发流程,还需要一种能够支持敏捷方法的架构体系。《数字化时代的敏捷架构》提出的敏捷架构框架(Agile …

建筑物规则化(实现) --- 特征边分组、重构、直角化

规则化建筑物 一、摘 要 建筑物多边形在地图综合中的两类处理模型:化简与直角化。 建筑物矢量数据来源广泛,在数据获取过程中,受GPS精确度、遥感影像分辨率或人为因素的影响,数据往往存在不同程度的误差。其中,图像分割、深度学习…

规范化JavaBean

Java Bean 是一个很常见的概念,简单来说就是一个 Java 类,其中的内容就是各种属性,以及各个属性的 getter/setter 。例如: class Student {private String name;private int age;public String getName() {return this.name;}pub…

网络协议与Netty

1、讲一讲什么是RPC? 说到RPC就必须要聊一聊单体项目和分布式/微服务项目 单体项目时:一次服务调用发生在同一台机器上的 同一个进程内部 ,也就是说调用发生在本机内部,因此也被叫作本地方法调用。 分布式/微服务项目时&#x…

负载均衡:定义与核心作用

负载均衡:定义与核心作用 一、负载均衡的定义二、负载均衡的核心作用 💖The Begin💖点点关注,收藏不迷路💖 负载均衡,作为网络技术的重要一环,对优化资源利用和提升服务器响应速度至关重要。本文…

Ps:首选项 - 界面

Ps菜单:编辑/首选项 Edit/Preferences 快捷键:Ctrl K Photoshop 首选项中的“界面” Interface选项卡可以定制 Photoshop 的界面外观和行为,从而创建一个最适合自己工作习惯和需求的工作环境。这些设置有助于提高工作效率,减轻眼…

快速带你玩转高性能web服务器

目录 一.Web 服务基础介绍 ​编辑1.1 互联网发展历程回顾 1.2 Web 服务介绍 1.2.1 Apache的图标 1.2.2 NGINX的图标: 1.2.3 Apache 经典的 Web 服务端 1.2.3.1 Apache prefork 模型 1.2.3.2 Apache worker 模型 1.2.3.3 Apache event模型 1.2.4 Nginx-高性能的 Web …

PanDownload 网页复刻版最新PHP源码

源码介绍 PanDownload 网页复刻版,PHP语言版,PanDownload在线解析下载的优点,速度快,受用户自身带宽限制,就是说你的宽度交多少决定你下载的速度,不用下载百度网盘客户端,你可以直接使用解析所…

PingCAP 携手 CCF 数据库专委会打造“开源数据库领域拔尖创新人才培育计划”,共塑数据库教育未来丨NDBC 2024

2024 年 8 月 7 日 - 10 日,由中国计算机学会主办、中国计算机学会数据库专业委员会和新疆大学承办、新疆 IT 三会等单位协办的第 41 届中国数据库学术会议(NDBC 2024)在新疆乌鲁木齐成功举办。 大会上 PingCAP 联合创始人黄东旭发表了主题演…

LabVIEW深度监测系统

随着果园机械化作业的迅速发展,传统的人工监测方式已难以满足现代农业的高效率与精准性需求。本文介绍了一种基于LabVIEW软件的果园开沟深度监测系统,该系统通过集成先进的传感技术与数据处理算法,实现了对开沟深度的实时精确监测和自动控制&…

11.SPI通信

SPI理论 常规四线:SCLK、CS、MOSI(主向从发)、MISO(从向主发) 同步、串行、全双工、速率(MHz) 一主一从、一主多从、不能多主 工作模式: CPOL 0:总线空闲状态时钟为低电平,1:总线空闲状态时钟为高电平 CPHA 0&#…

【Python系列】执行 Shell 命令的六种方法

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

0.91寸OLED迷你音频频谱

一、简介 音频频谱在最小0.91寸OLED 屏幕上显示,小巧玲珑 二、应用场景 本模块为音频频谱显示模块,用来获取声音频谱并展示频谱,跟随音乐声音律动 三、产品概述 基于主控芯片设计的将声音采集分析频谱,显示到0.91寸OLED的功能…

【Git】常见命令的使用

Git 介绍流程安装常见命令本地仓与远程仓关联 介绍 Git、Svn:版本控制器(用于多人团队协作) Svn:集中式版本控制器;版本库集中放在中央服务器,操作非常简单,鼠标右键提交、新增、下载 Git&…