基于SpringBoot设计模式之创建型设计模式·生成器模式

文章目录

  • 介绍
  • 开始
    • 架构图
    • 样例一
      • 定义生成器
      • 定义具体生成器(HTML格式、markdown格式)
        • 实体类
        • HTML格式生成器
        • MarkDown格式生成器
    • 测试样例
  • 总结
    • 优点
    • 缺点

介绍

  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  如:大都市中林立着许多高楼大厦,这些高楼大厦都是具有建筑结构的大型建筑。通常,建造和构建这种具有建筑结构的大型物体在英文中称为Build
  在建造大楼时,需要先打牢地基,搭建框架,然后自下而上地一层一层盖起来。通常,在建造这种具有复杂结构的物体时,很难一气呵成。我们需要首先建造组成这个物体的各个部分,然后分阶段将它们组装起来。

开始

架构图

生成器

样例一

定义生成器

public interface IBuilder {

    /**
     * 打开
     */
    void open();

    /**
     * 建造一个 标题
     *
     * @param str
     */
    void buildTitle(String str);

    /**
     * 生成托盘的父类
     *
     * @param str
     */
    void buildString(String str);

    /**
     * 建造一个托盘
     *
     * @param myDomainList
     */
    void buildTray(List<MyDomain> myDomainList);

    /**
     * 释放,结束
     */
    void close();
}

定义具体生成器(HTML格式、markdown格式)

实体类
@Data
public class MyDomain implements Serializable {

    /**
     * 链接
     */
    private String url;

    /**
     * 内容
     */
    private String content;

}
HTML格式生成器
@Service
@Slf4j
public class HtmlBuilder implements IBuilder {
    @Override
    public void open() {
        System.out.println("<html><head><title>HTML生成器</title></head><body>");
    }

    @Override
    public void buildTitle(String str) {
        System.out.println("<h1>" + str + "</h1>");
    }

    @Override
    public void buildString(String str) {
        System.out.println(str + "<ul>");
    }

    @Override
    public void buildTray(List<MyDomain> myDomainList) {
        for (MyDomain myDomain : myDomainList) {
            System.out.println("<li><a href=\"" + myDomain.getUrl() + "\">" + myDomain.getContent() + "</a></li>");
        }
        System.out.println("</ul>");
    }

    @Override
    public void close() {
        System.out.println("</body></html>");
    }
}

MarkDown格式生成器
@Service
@Slf4j
public class MarkDownBuilder implements IBuilder {
    @Override
    public void open() {
    }

    @Override
    public void buildTitle(String str) {
        System.out.println("# " + str);
        System.out.println();
    }

    @Override
    public void buildString(String str) {
        System.out.println(str);
    }

    @Override
    public void buildTray(List<MyDomain> myDomainList) {
        for (MyDomain myDomain : myDomainList) {
            System.out.println(" - [" + myDomain.getContent() + "](" + myDomain.getUrl() + ")");
        }
        System.out.println();
    }


    @Override
    public void close() {

    }
}

测试样例

@Slf4j
@SpringBootTest(classes = BuilderApplication.class)
public class TestBuilder {

    @Resource
    private Map<String, IBuilder> builderMap;

    @Resource
    private Director director;

    @Test
    public void testBuilder() {

        for (Map.Entry<String, IBuilder> map : builderMap.entrySet()) {
            log.info("----------------------------------------");
            log.info("这是 : {} \n 准备开始建造", map.getKey());
            director.printContent(map.getValue());
            log.info("建造完毕");
            log.info("----------------------------------------");
        }

    }
}

总结

优点

  在 Builder类中,需要声明编辑文档(实现功能)所必需的所有方法。Director 类中使用的方法都是 Builder 类提供的。因此,在 Builder 类中应当定义哪些方法是非常重要的。而且,Builder类还必须能够应对将来子类可能增加的需求。
  在示例程序中,我们只编写了支持MarkDown文档的子类和支持 HTML 代码的子类。但是将来可能还会希望能够编写其他形式(例如xxXx形式)的文档。那时候,到底能不能编写出支持xxXx形式xxXxBuilder类呢?应该不需要新的方法吧?
  虽然类的设计者并不是神仙,他们无法准确地预测到将来可能发生的变化。但是,我们还是有必要让设计出的类能够尽可能灵活地应对近期可能发生的变化。

缺点

  他的优点便也是他的缺点。之后如果要支持新的xxXx形式的文档,然而最初提供的方法并不满足他的要求,这个时候就要在生成器上添加方法,届时所有的实现类都要加上这个方法。
  除此以外,还要关心加上了之后,会不会影响到我整体设计上。

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

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

相关文章

C++ | Leetcode C++题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; class Solution { public:int numDecodings(string s) {int n s.size();// a f[i-2], b f[i-1], c f[i]int a 0, b 1, c;for (int i 1; i < n; i) {c 0;if (s[i - 1] ! 0) {c b;}if (i > 1 && s[i - 2] ! 0 &&a…

每日一题13:Pandas:方法链

一、每日一题 &#xff1b;&#xff1a;&#xff1a; 解答&#xff1a; import pandas as pddef findHeavyAnimals(animals: pd.DataFrame) -> pd.DataFrame:heavy_animals animals[animals[weight] > 100].sort_values(byweight, ascendingFalse)result heavy_anim…

ssm132医院住院综合服务管理系统设计与开发+vue

医院住院综合服务管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对医院住院信息管理混乱&…

低代码开发平台在城市数字化转型中的技术实现与案例分析

城市数字化转型需要政策引导、技术创新、基础设施建设、人才培养、多方合作以及安全保障等全方位的支持与助力&#xff0c;共同推动城市的数字化进程&#xff0c;提升其竞争力和可持续发展能力。 其中&#xff0c;技术创新是推动数字化转型的核心动力&#xff0c;需要不断加强…

【kubernetes】集群的二进制部署安装

目录 一、环境部署 二、部署 docker引擎 三、部署 etcd 集群 1、准备签发证书环境 1.1 master01服务器配置 1.1.1 准备cfssl证书生成工具 1.1.2 生成Etcd证书 1.1.3 创建存放etcd配置文件&#xff0c;命令文件&#xff0c;证书的目录&#xff0c;并启动etcd服务 1.1.4…

Android中使用Palette让你的页面UI优雅起来

文章目录 1. 什么是Palette2. 引入Palette3. 使用 Palette3.1 同步方式3.2 异步方式3.3 获取色调值 4. 举例4.1 布局文件 activity_palette_list.xml ⬇️4.2 Activity&#xff1a;PaletteListActivity⬇️4.3 列表Adapter&#xff1a;PaletteListAdapter ⬇️4.4 列表item布局…

数字化智能:Web3时代的物联网创新之路

引言 随着科技的不断发展&#xff0c;物联网&#xff08;IoT&#xff09;技术正在迅速普及和应用。而随着Web3时代的到来&#xff0c;物联网将迎来新的发展机遇和挑战。本文将探讨Web3时代的物联网创新之路&#xff0c;深入分析其核心技术、应用场景以及未来发展趋势。 Web3时…

kk聊天室系统源码搭建-自适应手机电脑-秒级响应-群体消息

kk聊天室系统源码搭建-自适应手机电脑-秒级响应-群体消息-单体消息 可以无限创建聊天室&#xff0c;可以把单个聊天室链接拿出来单独使用&#xff0c;消息秒级响应&#xff0c;支持设置屏蔽词。 具体仔细看视频演示&#xff0c;不提供演示&#xff0c;因为青狐资源网会员用户太…

【Linux】缓冲区

目录 一、初识缓冲区 二、用户级缓冲区 三、内核级缓冲区 四、内核级缓冲区 VS 用户级缓冲区 五、用户级缓冲区在哪里&#xff1f; 一、初识缓冲区 缓冲区是什么&#xff1f;可以简单理解成一部分内存。例如用户缓冲区(char arr[])、C标准库提供的缓冲区、操作系统提供的缓…

【Python】图形用户界面设计

1、设计并编写一个窗口程序,该窗口只有一个按钮,当用户单击时可在后台输出hello world. import tkinter as tk def on_button_click():print("hello world") # 创建主窗口 root tk.Tk() root.title("Hello World Button") # 设置窗口大小 root.geometry…

Vue的学习 —— <网络请求库Axios>

目录 前言 正文 一、Axios基本概念 二、安装Axios 三、Axios使用方法 四、向服务器发送请求 前言 在之前的开发案例中&#xff0c;我们通常直接在组件中定义数据。但在实际的项目开发中&#xff0c;我们需要从服务器获取数据。当其他用户希望访问我们自己编写的网页时&a…

区块链数据集(一)Xblock

一、Transaction Datasets Ethereum On-chain Data [Dataset] 2021-10TransactionData/Code AvailableEthereum Introduction: This is the dataset of paper “XBlock-ETH: Extracting and Exploring Blockchain Data From Ethereum”. Data / Code Paper CiteDownloads: …

vue3 自定义组件

在项目中&#xff0c;我们会遇到一些没有现成的组件&#xff0c;那这个时候我们就需要自己去写一个满足我们需求的组件。 比如&#xff0c;我需要一个上下排布&#xff0c;上面显示标题&#xff0c;下面显示内容的组件。封装完成后方便复用。 1、布局组件 我定义一个上下结构的…

meshlab: pymeshlab沿着椭圆赤道投影展开当前网格的几何图形并保存(geometric cylindrical unwrapping)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 本文所给出的例子是https://download.csdn.net/download/weixin_42605076/89233917中的…

51单片机入门:I2C通讯协议

I2C通讯协议 I2C简介 串口通信只能在两个设备之间进行&#xff0c;如果是三个设备相互通讯&#xff0c;那么每个设备需要两组串口&#xff0c;实际上是3组相互独立的串口通信。如果是4个设备相互通信就更加麻烦了&#xff0c;最突出的问题就是线路连接比较复杂。 为了解决这个…

现代加密技术(对称和非对称加密)

1.分类 现代加密技术&#xff1a;对称和非对称加密&#xff0c;对称加密即共享密钥&#xff0c;非对称加密是公钥加密算法。 2.基础总结 AES是什么算法&#xff1f; 分组加密算法&#xff0c;对称加密算法AES的分组长度是&#xff1f;固定128位AES密钥长度是多少&#xff1f;支…

Shell编程之数组

一.数组定义方法 1.数组名称&#xff08;数值1 数值2 数值3 数值4 数值5&#xff09;数组名称&#xff08;"字符串1" "字符串2" "字符串4" "字符串5" "字符串6"&#xff09;(或者使用单引号) 如何查看数组的元素&#xff1…

java代码混淆工具ProGuard混淆插件

java代码混淆工具ProGuard混淆插件 介绍 ProGuard是一个纯java编写的混淆工具&#xff0c;有客户端跟jar包两种使用方式。可以将程序打包为jar&#xff0c;然后用工具进行混淆&#xff0c;也可以在maven中导入ProGuard的插件&#xff0c;对代码进行混淆。 大家都知道 java代…

ADS Momentum 仿真设置

1、选择Momenttum Microwave。 2、Layout不需要操作。 3、Partitioning 不需要操作。 4、没有叠层的话需要新建叠层&#xff0c;过孔可以在叠层中右键添加。 5、注意确认端口的Gnd Layer。 6、设置仿真频率。 7、Output Plan。 8、Option。 最后运行仿真&#xff0c;等待结果即…

C++ static_cast学习

static_cast可实现&#xff0c; 1 基本类型之间的转换 2 void指针转换为任意基本类型的指针 3 用于有继承关系的子类与父类之间的指针或引用的转换 用于基本类型转化时&#xff0c;会损失精度类似于C语言的强制转化&#xff1b; 下面先看一下void指针的转换&#xff1b; …