设计模式-构建者模式

news2024/12/28 23:09:24

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS二次开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397)

目录

定义

特点

使用场景

优缺点

(1) 优点

(2) 缺点

模式结构

具体实现

(1) 方式1

(2) 方式2

实际应用


定义

造者模式(Builder Pattern):使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

特点

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

使用场景

    • 相同的方法,不同的执行顺序,产生不同的结果。
    • 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
    • 产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
    • 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。

优缺点

(1) 优点
    • 封装性好,构建和表示分离。
    • 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
    • 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
(2) 缺点
    • 产品的组成部分必须相同,这限制了其使用范围。
    • 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。

模式结构

建造者(Builder)模式的主要角色如下。

    • 产品角色(Menu):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
    • 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 build()。
    • 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
    • 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

具体实现

(1) 方式1

抽象构建器和菜单项

/**
 * 抽象的构造器
 */
public abstract class Builder {

    protected Menu menu = new Menu();

    /**
     * 构建复制菜单项
     */
    abstract void buildCopyMenuItem();

    /**
     * 构建粘贴菜单项
     */
    abstract void buildPasteMenuItem();

    /**
     * 构建剪切菜单项
     */
    abstract void buildCutMenuItem();

    public Menu getMenu() {
        return menu;
    }
}

/**
 * 手机版的菜单构建器
 */
public class PhoneMenuBuilder extends Builder {
    @Override
    void buildCopyMenuItem() {
        MenuItem menuItem = new MenuItem(1, "复制", 1);
        menu.setCopyMenuItem(menuItem);
    }

    @Override
    void buildPasteMenuItem() {
        MenuItem menuItem = new MenuItem(2, "粘贴", 2);
        menu.setPasteMenuItem(menuItem);
    }

    @Override
    void buildCutMenuItem() {
        MenuItem menuItem = new MenuItem(3, "剪切", 3);
        menu.setCutMenuItem(menuItem);
    }
}

/**
 * 菜单
 */
public class Menu {

    /**
     * 复制菜单项
     */
    private MenuItem copyMenuItem;

    /**
     * 粘贴菜单项
     */
    private MenuItem pasteMenuItem;

    /**
     * 剪贴菜单项
     */
    private MenuItem cutMenuItem;
}

构建指挥者

/**
 * 指挥者
 */
public class Director {

    private Builder builder;

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

    /**
     * 构建菜单
     */
    public Menu construct() {
        builder.buildCopyMenuItem();
        builder.buildPasteMenuItem();
        builder.buildCutMenuItem();
        return builder.getMenu();
    }

}

具体使用

public class App {

    public static void main(String[] args) {
        //构建菜单
        Builder builder = new PhoneMenuBuilder();
        Director director = new Director(builder);
        Menu menu = director.construct();
        System.out.println("menu:" + menu);
    }
}
(2) 方式2

内部内的构建器,链式编程

/**
 * http请求
 */
public class HttpRequest {
    private String url;

    private String contentType;

    private String method;

    private String body;

    public String getUrl() {
        return url;
    }

    public String getContentType() {
        return contentType;
    }

    public String getMethod() {
        return method;
    }

    public String getBody() {
        return body;
    }

    public static class Builder {
        private String url;

        private String contentType;

        private String method;

        private String body;

        public Builder setUrl(String url) {
            this.url = url;
            return this;
        }

        public Builder setContentType(String contentType) {
            this.contentType = contentType;
            return this;
        }

        public Builder setMethod(String method) {
            this.method = method;
            return this;
        }

        public Builder setBody(String body) {
            this.body = body;
            return this;
        }

        public HttpRequest build() {
            HttpRequest httpRequest = new HttpRequest();
            httpRequest.url = this.url;
            httpRequest.contentType = this.contentType;
            httpRequest.method = this.method;
            httpRequest.body = this.body;

            return httpRequest;
        }
    }
}

具体使用

public class App {
    public static void main(String[] args) {
        //构建请求信息
        HttpRequest httpRequest = new HttpRequest.Builder()
                .setUrl("http://www.xxx.com")
                .setContentType("application/json")
                .setMethod("POST")
                .setBody("123")
                .build();
        System.out.println("httpRequest:" + httpRequest);
    }
}

实际应用

1、游戏软件中,地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分,可以使用建造者模式对其进行设计,通过不同的具体建造者创建不同类型的地图或人物。

2、复杂对象的构建,如StringBuilder、wps各组件菜单的MenuBuilder、OKHttp网络库的HttpRequestBuilder等。

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

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

相关文章

重看Spring聚焦Environment分析

目录 一、理解Environment的设计 (一)整体理解 (二)聚焦Profiles分析 (三)聚焦Properties分析 二、Environment类图结构分析 三、PropertyResolver源码分析 (一)源码展示说明…

广东理工学院携手泰迪智能科技成功部署人工智能实验室

广东理工学院是经国家教育部批准设立的全日制普通本科院校,入选全国应用型人才培养工程培养基地、国家级众创空间试点单位、广东省高校电子商务人才孵化基地。开设34个本科专业,涵盖工学、经济学、管理学、文学、艺术学、教育学等6大学科门类&#xff0c…

Power BI 如何创建页面导航器?(添加目录按钮/切换页面按钮)

Power BI 中页导航是什么? 在Power BI中,页导航(Page Navigation)是指在报告中创建多个页面(页),然后允许用户在这些页面之间进行导航的功能。 如下图所示,页导航的选项和报告中的…

李飞飞团队《2024 年人工智能指数报告》AI十大趋势:中国AI专利数全球第一

《2024 年人工智能指数报告》 当地时间4月15日,斯坦福大学“以人为本”人工智能研究院(Human Centered Artificial Intelligence,简称HAI)发布了第七个年度AI Index报告,这是关于AI行业现状的最全面的报告之一。 报告…

聊聊go语言中的GMP模型

写在文章开头 我们都知道go语言通过轻量级线程协程解决并发问题,按照go语言的思想这些协程运行完成后即焚,那么go语言如何保证并发线程有序获取协程呢? 带着这个问题我们从go语言底层的源码来阐述这个问题: Hi,我是 s…

K-means聚类算法:如何在杂乱无章的数据中找出规律?

什么是K-means聚类算法? 在编程的世界里,K-means聚类算法就像一位无私的指路人,它不需要我们给出明确的指示,只需要我们提供数据,它就能帮助我们找到数据的归属,找到数据的“家”。 K-means聚类算法的名字…

经典的目标检测算法有哪些?

一、经典的目标检测算法有哪些? 目标检测算法根据其处理流程可以分为两大类:One-Stage(单阶段)算法和Two-Stage(两阶段)算法。以下是一些经典的目标检测算法: 单阶段算法: YOLO (You Only Loo…

【御控工业物联网】JAVA JSON结构转换、JSON结构重构、JSON结构互换(5):对象To对象——转换映射方式

御控官网:https://www.yu-con.com/ 文章目录 御控官网:[https://www.yu-con.com/](https://www.yu-con.com/)一、JSON结构转换是什么?二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构…

Linux中的vi与vim:编辑器的王者之争与深度探索

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、Linux的起源与发展 2、vi与vim的历史与发展 …

【C++】手撕list(list的模拟实现)

目录 01.节点 02.迭代器 迭代器运算符重载 03.list类 (1)构造与析构 (2)迭代器相关 (3)容量相关 (4)访问操作 (5)插入删除 我们在学习数据结构的时候…

Laravel 6 - 第十一章 中间件

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

Unity 如何制作和发布你的 Package

一、制作你的第一个 Package Unity Package 不做过多赘述,像 URP 本质上也是一个 Package,在 Unity 中可以通过菜单栏 → Window → Package manager 来管理你当前的所有 Package 本篇文章主要介绍:如何制作并发布属于你的 Package 1.1 Pac…

将本地项目推送至gitlab仓库

1. gitlab上新建一个空白项目 gitlab上点击new project按钮,新建一个项目 新建空白项目 项目名称与本地新建项目名称相同,其余根据具体需要选择 2. 初始化本地仓库并commit项目 进入本地项目根目录下,右击 git bash here打开命令窗口 初始化…

8.4.2 实验2:配置Trunk

1、实验目的 通过本实验可以掌握: Native VLAN 的含义和配置。IEEE802.1q 封装Trunk 配置和调试方法。 2、实验拓扑 配置 Trunk 的实验拓扑如下图所示。 图8-6 配置 Trunk 的实验拓扑 3、实验步骤 3.1 在交换机S1、S2上创建 VLAN 并把端口划分到相应的VLAN中 …

ASP.NET教务管理平台-权限及公共模块设计与开发

摘 要 随着教育改革的不断深化,高等院校的建设与发展对国民整体素质的提高起着越来越重要的作用,建立一套能够适应这些改变的行政管理方案也就显得尤为重要。对于教务处来说,将信息技术用于校务管理中便是迫切的要求。 教务系统中的用户…

ROS 2边学边练(33)-- 写一个静态广播(C++)

前言 通过这一篇我们将了解并学习到如何广播静态坐标变换到tf2(由tf2来转换这些坐标系)。 发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系非常有用。例如,在以激光扫描仪中心的坐标系中推理激光扫描测量数据是最简单的。 这…

Ventus(承影):基于RISC V的开源GPGPU

Ventus(承影):基于RVV的开源GPGPU 清华大学集成电路学院dsp-lab的承影RVV GPGPU设计文档。 整体目标 提供一个开源的基于RVV的GPGPU实现方案,并给出软件映射方案、指令集(支持的指令及特性、添加的自定义指令&#xf…

15.接口自动化学习-Mock(挡板/测试桩)

场景: 新需求还未开发时,使用mock提早介入测试,等后边开发后,进行调试 三方接口返回效率低,使用mock技术走通流程 1.mock方式 (1)如果会写django或flask,可以写简单对应的代码 (…

小米一面:说说MVC与设计模式的关系

前言 大家好,我叫阿杆,不叫阿轩。 先来看看面试环节吧。 面试官:请说说MVC模式是基于哪种设计模式的? 求职者:MVC本身不就是一种设计模式吗? 面试官:我的意思是,MVC是基于23中设计…

【04-提升模型性能:集成学习与超参数优化】

文章目录 前言集成学习BaggingBoosting超参数优化随机搜索贝叶斯优化总结前言 在前几篇博文中,我们已经介绍了一些机器学习的基础知识、Scikit-learn的核心工具与技巧,以及如何评估模型性能。本篇博文将重点讲解两个可以显著提升机器学习模型性能的高级策略:集成学习和超参数…