创建性-构造者设计模式

前言

      我们在使用Retrofit等这些第三方框架的时候,发现他们的使用都很方便,比如Retrofit retrofit = new Retrofit.Builder().build(),和我们通常直接new一个对象不同,他是交给Builder类,通过build()函数来构造一个Retrofit对象。

      刚开始使用,可能不太明白,明明可以直接new出来,为什么要交给Builder来构造呢?那么通过学习了构造者设计模式,才明白,原来当使用者构造对象时,构造函数的参数一般大于等于五个,就可以考虑使用构造者设计模式,这样编写代码的好处,在于结构清晰,也易于扩展。

     在实际工作中,我们可能接触了很多这种链式创建对象的场景,比如AlertDialog,发现这种代码在使用的时候,真的很香,不仅实现了参数传递的灵活性,也避免了因参数过多造成的混乱。总之,除了使用官方封装的这些类以外,自己在实现代码的同时,也想要动手实现一个建造者设计模式。

 实现

    下面我们以电脑为例,创建一个抽象类Computer,我们想想,电脑都有什么属性,品牌,型号,操作系统,用途,类型,名字等等。这些属性如果都用构造方法实现的话,会很长,而且也不易于扩展,不够灵活。

 static class Computer{
        String name;
        String brand;
        String os;
        String display;
        String type;
        String use;

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

        public void setBrand(String brand) {
            this.brand = brand;
        }

        public void setOs(String os) {
            this.os = os;
        }

        public void setDisplay(String display) {
            this.display = display;
        }

        public void setType(String type) {
            this.type = type;
        }

        public void setUse(String use) {
            this.use = use;
        }
    }

     比如,我们需要创造一个macbook笔记本,用传统思维,直接创造一个类,然后继承Computer,通过构造函数的方法重载,完成各种需求的笔记本。这样一套下来,代码臃肿不说,也不宜与后期的维护,如果有新的属性,又要重载一个构造函数,比较繁琐。

    static class MacBook extends Computer{
        public MacBook() {
        }
        
        // ……
        //各种构造函数
        // ……        
 
        @Override
        public String toString() {
            return "MacBook{" +
                    "name='" + name + '\'' +
                    ", brand='" + brand + '\'' +
                    ", os='" + os + '\'' +
                    ", display='" + display + '\'' +
                    ", type='" + type + '\'' +
                    ", use='" + use + '\'' +
                    '}';
        }
    }

    如果有一个专门的类,来创建不同需求的笔记本,这个问题就能很好的解决。

    那么这个专门的类就是Builder类,通过构造者设计模式进行优化,我们这里具体到了MacBook笔记本,在实际开发工作中,这个可以使用泛型T代替,更加灵活。

 static abstract class Builder {
        abstract MacBookBuilder builderName(String name);

        abstract MacBookBuilder builderBrand(String brand);

        abstract MacBookBuilder builderOs(String os);

        abstract MacBookBuilder builderType(String type);

        abstract MacBookBuilder builderUse(String use);

        abstract MacBookBuilder builderDisPlay(String display);

        abstract Computer build();

    }

  接下来,我们将利用MacBookBuilder 来构造笔记本,代码如下:

 static class MacBookBuilder extends Builder{

        MacBook macBook = new MacBook();

       @Override
        MacBookBuilder builderName(String name) {
            macBook.name = name;
            return this;
        }

        @Override
        MacBookBuilder builderBrand(String brand) {
            macBook.brand = brand;
            return this;
        }

        @Override
        MacBookBuilder builderOs(String os) {
            macBook.os = os;
            return this;
        }

        @Override
        MacBookBuilder builderType(String type) {
            macBook.type = type;
            return this;
        }

        @Override
        MacBookBuilder builderUse(String use) {
            macBook.use = use;
            return this;
        }

        @Override
        MacBookBuilder builderDisPlay(String display) {
            macBook.display = display;
            return this;
        }

        @Override
        Computer build() {
            return macBook;
        }
    }

好了,我们通过测试类,测试一下,附上完整代码:

package com.example.lib;


public class BuilderTest {

    public static void main(String[] args) {

        Computer macbook = new MacBookBuilder()
                .builderName("macbook 2023")
                .builderOs("mac/os")
                .builderBrand("apple")
                .builderType("Laptops")
                .builderDisPlay("Retina显示器")
                .builderUse("studyProgram")
                .build();

        System.out.println(macbook.toString());
    }


    static class Computer{
        String name;
        String brand;
        String os;
        String display;
        String type;
        String use;

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

        public void setBrand(String brand) {
            this.brand = brand;
        }

        public void setOs(String os) {
            this.os = os;
        }

        public void setDisplay(String display) {
            this.display = display;
        }

        public void setType(String type) {
            this.type = type;
        }

        public void setUse(String use) {
            this.use = use;
        }
    }


    static class MacBook extends Computer{
        public MacBook() {
        }

        @Override
        public String toString() {
            return "MacBook{" +
                    "name='" + name + '\'' +
                    ", brand='" + brand + '\'' +
                    ", os='" + os + '\'' +
                    ", display='" + display + '\'' +
                    ", type='" + type + '\'' +
                    ", use='" + use + '\'' +
                    '}';
        }
    }


    static abstract class Builder {
        abstract MacBookBuilder builderName(String name);

        abstract MacBookBuilder builderBrand(String brand);

        abstract MacBookBuilder builderOs(String os);

        abstract MacBookBuilder builderType(String type);

        abstract MacBookBuilder builderUse(String use);

        abstract MacBookBuilder builderDisPlay(String display);

        abstract Computer build();

    }

   static class MacBookBuilder extends Builder{

        MacBook macBook = new MacBook();

       @Override
        MacBookBuilder builderName(String name) {
            macBook.name = name;
            return this;
        }

        @Override
        MacBookBuilder builderBrand(String brand) {
            macBook.brand = brand;
            return this;
        }

        @Override
        MacBookBuilder builderOs(String os) {
            macBook.os = os;
            return this;
        }

        @Override
        MacBookBuilder builderType(String type) {
            macBook.type = type;
            return this;
        }

        @Override
        MacBookBuilder builderUse(String use) {
            macBook.use = use;
            return this;
        }

        @Override
        MacBookBuilder builderDisPlay(String display) {
            macBook.display = display;
            return this;
        }

        @Override
        Computer build() {
            return macBook;
        }
    }
}

总结 

构造者设计模式,在安卓开放当中非常常见,也是一种创建型设计模式,类似与工厂模式,但不同于工厂模式。主要优点如下:

  • 客户端不需要理解产品的内部细节,完成了产品本身与产品创建的解耦
  • 每一个具体的建造者都相对独立,产品的创建更加的精细化
  • 增加新的具体建造者,无需修改原有的代码,符合开闭原则
  • 使用链式编程,代码上更加美观

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

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

相关文章

【python使用 Pillow 库】缩小|放大图片

当我们处理图像时,有时候需要调整图像的大小以适应特定的需求。本文将介绍如何使用 Python 的 PIL 库(Pillow)来调整图像的大小,并保存调整后的图像。 环境准备 在开始之前,我们需要安装 Pillow 库。可以使用以下命令…

并发测试工具 apache-jmeter使用发送post请求JSON数据

目录 1 下载安装 2 汉化 3 创建高并发测试 配置线程组 创建web请求 创建监听器 结果树 汇总报告 为web请求添加token 添加Content-Type用于发送json 4 启动测试 5 查看结果 1 下载安装 官网Apache JMeter - Download Apache JMeter 解压运行 2 2 汉化 打开软件…

神经网络--感知机

感知机 单层感知机原理 单层感知机:解决二分类问题,激活函数一般使用sign函数,基于误分类点到超平面的距离总和来构造损失函数,由损失函数推导出模型中损失函数对参数 w w w和 b b b的梯度,利用梯度下降法从而进行参数更新。让1代表A类,0代…

ZMTP协议

ZoreMQ Transport Protocol是一个传输层协议,用于ZMQ的连接的信息交互,本文档描述的是3.0协议,主要分析基于NULL Security Mechanism 协议语法 ZMTP由三部分组成,分别是 greeting、handshake、traffic 部分描述构成greeting描述…

数据挖掘导论学习笔记1(第1 、2章)

参考:https://blog.csdn.net/u013232035/article/details/48281659?spm1001.2014.3001.5506 和《数据挖掘导论》学习笔记(第1-2章)_时机性样本_schdut的博客-CSDN博客 第1章 绪论 数据挖掘是一种技术,它将传统的数据分析方法…

【配置环境】Visual Studio 配置 OpenCV

目录 一,环境 二,下载和配置 OpenCV 三,创建一个 Visual Studio 项目 四,配置 Visual Studio 项目 五,编写并编译 OpenCV 程序 六,解决CMake编译OpenCV报的错误 一,环境 Windows 11 家庭中…

十大管理——项目成本管理

目录 1.成本管理概念 2.成本管理的四个过程域 2.1四个过程的整体理解 ​2.2四个过程的ITO口诀版记忆 2.3过程1——制定项目管理计划 ​2.4过程2——项目成本估算​ 2.5过程3——项目成本预算 2.5过程4——项目成本控制 3计算题 1.成本管理概念 项目成本管理就是要确保…

在R中安装TensorFlow、TensorFlow_Probability、numpy(R与Python系列第二篇)

目录 前言: 1-安装tensorflow库 Step1: 下载R包tensorflow Step2:安装TensorFlow库 Step3:导入R中 2-安装tensorflow_probability库 Step1:下载R包:tfprobability Step2:安装TensorFlow Probability …

【分类】分类性能评价

评价指标 1、准确率、召回率、精确率、F-度量、ROC ​ 属于各类的样本的并不是均一分布,甚至其出现概率相差很多个数量级,这种分类问题称为不平衡类问题。在不平衡类问题中,准确率并没有多大意义,我们需要一些别的指标。 ​ 通…

Flutter:getX的学习

前言 学习教程:Getx教程_FlutterGetx系列实战教程 简介 getX是第三方的状态管理插件,不仅具有状态管理的功能,还具有路由管理、主题管理、国际化多语言管理、网络请求、数据验证等功能。相比其他状态管理组件,getX简单、功能强大…

【网络编程上】

目录 一.什么是互联网 1.计算机网络的定义与分类(了解) (1)计算机网络的定义 (2)计算机网络的分类 ① 按照网络的作用范围进行分类 ②按照网络的使用者进行分类 2.网络的网络 (理解&#xf…

基于Vue3+ts+Pinia的后台管理系统

Vue3tsPinia管理系统 项目介绍项目简介界面展示登录界面商品界面用户界面角色管理界面 接口文档项目地址 项目介绍 包含对商品、订单、用户增删改查等后台的管理业务,并提供数据可视化的报表功能的管理系统。界面进行了高级封装,可以通过引入组件传入配…

利用frps搭建本地自签名https服务的透传

nginx的搭建就不介绍了,教程很多,基本上油手就会。 在本例中,frp服务器的域名是 www.yourfrp.com,同时也是反向代理nginx服务器; 本地网站要用的域名: test.abcd.com 请事先将 test.abcd.com 解析到 frp所在服务器…

OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字

目录 1.绘制直线line() 2.绘制圆形circle() 3.绘制椭圆形ellipse() 4.绘制矩形rectangle() 5.绘制多边形 fillPoly() 6.绘制文字putText() 7.例子 1.绘制直线line() CV_EXPORTS_W void line(InputOutputArray img,Point pt1, Point pt2,const Scalar& color,int t…

CSS学习笔记05

CSS笔记05 定位 position CSS 属性position - 用于指定一个元素在文档中的定位方式。top,right,bottom 和 left 属性则决定了该元素的最终位置。position 有以下常用的属性值: position: static; - 默认值。指定元素使用正常的布局行为&am…

wap2app 隐藏系统状态栏

一、首先创建wap2App项目 1、文件》新建》项目 2、选择Wap2App项目:输入项目名称、网站首页地址(如果是本地localhost的话改为你的IP地址即可),点击创建 二、创建完wap2App项目后 隐藏系统状态栏只要修改1、2选项即可 1、找到根…

uniapp实现移动端的视频图片轮播组件

1、视频轮播组件app体验地址 https://tt.appc02.com/nesxr6 2、支持小程序、H5、APP&#xff0c;在小程序上运行的效果图 3、使用方法 第一步&#xff0c;按照截图步骤配置好 第二步&#xff1a;参考以下代码&#xff0c;使用视频图片轮播组件 <template><view>…

aarch64-linux交叉编译libcurl带zlib和openssl

交叉编译libcurl需要依赖zlib和openssl 需要先用aarch64工具链编译zlib和openssl aarch64-linux环境搭建 下载工具链 gcc用于执行交叉编译 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnusysroot是交叉版本的库文件集合 sysroot-glibc-linaro-2.25-2019.12-aarch64-lin…

K8S最新版本集群部署(v1.28) + 容器引擎Docker部署(下)

温故知新 &#x1f4da;第三章 Kubernetes各组件部署&#x1f4d7;安装kubectl&#xff08;可直接跳转到安装kubeadm章节&#xff0c;直接全部安装了&#xff09;&#x1f4d5;下载kubectl安装包&#x1f4d5;执行kubectl安装&#x1f4d5;验证kubectl &#x1f4d7;安装kubead…

常见矿石材质鉴定VR实训模拟操作平台提高学员的学习效果和实践能力

随着“元宇宙”概念的不断发展&#xff0c;在矿山领域中&#xff0c;长期存在传统培训内容不够丰富、教学方式单一、资源消耗大等缺点&#xff0c;无法适应当前矿山企业发展需求的长期难题。元宇宙企业借助VR虚拟现实、web3d开发和计算机技术构建的一个虚拟世界&#xff0c;为用…
最新文章