基于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 {@Overridepublic void open() {System.out.println("<html><head><title>HTML生成器</title></head><body>");}@Overridepublic void buildTitle(String str) {System.out.println("<h1>" + str + "</h1>");}@Overridepublic void buildString(String str) {System.out.println(str + "<ul>");}@Overridepublic 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>");}@Overridepublic void close() {System.out.println("</body></html>");}
}
MarkDown格式生成器
@Service
@Slf4j
public class MarkDownBuilder implements IBuilder {@Overridepublic void open() {}@Overridepublic void buildTitle(String str) {System.out.println("# " + str);System.out.println();}@Overridepublic void buildString(String str) {System.out.println(str);}@Overridepublic void buildTray(List<MyDomain> myDomainList) {for (MyDomain myDomain : myDomainList) {System.out.println(" - [" + myDomain.getContent() + "](" + myDomain.getUrl() + ")");}System.out.println();}@Overridepublic void close() {}
}

测试样例

@Slf4j
@SpringBootTest(classes = BuilderApplication.class)
public class TestBuilder {@Resourceprivate Map<String, IBuilder> builderMap;@Resourceprivate Director director;@Testpublic 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形式的文档,然而最初提供的方法并不满足他的要求,这个时候就要在生成器上添加方法,届时所有的实现类都要加上这个方法。
  除此以外,还要关心加上了之后,会不会影响到我整体设计上。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

停车场车位引导系统是什么,停车场车位引导系统有哪些作用?

随着城市交通的快速发展&#xff0c;车辆的数量也在迅速增长&#xff0c;随之而来的就是停车难的问题&#xff0c;那么在城市中&#xff0c;如何合理的利用好现有资源&#xff0c;让停车资源得到合理利用呢&#xff1f;这就需要一套科学有效的智能停车场系统&#xff0c;可以帮…

2024 年第四届长三角高校数学建模竞赛B题

赛道 B&#xff1a;人工智能范式的物理化学家 物理和化学研究的对象日益复杂化、高维化&#xff0c;传统的研究范式主要是依赖于“穷举”、“试错”、“重复”等手段。面对庞大的化学空间&#xff0c;配方和工艺等各种参数的搜索常常止步于局部最优&#xff0c;无法进行配方和工…

圆上点云随机生成(人工制作模拟数据)

1、背景介绍 实际上,很多地物外表形状满足一定的几何形状结构,如圆形是作为常见一类。那么获取该类目标的点云数据便是位于一个圆上的点云数据。如下图所示为两簇典型的点云,其中一种为理想型,点均位于一个圆上,另外一簇则是近似位于一个圆上,这种更加符合真实情况。有时…

语法分析-文法

如果对于一部文法中&#xff0c;存在至少一个句子有两个或者两个以上的语法树则该文法是二义性的。 我们可以以上面的例子进行解释&#xff0c;对于第棵个语法树&#xff0c;我们可以看到是先进行了加法运算再进行的乘法运算&#xff0c;因为需要先把EE作为整体运算完后再成为E…

18.04版本的ubuntu没有连接网络的图标(坑人版)

以下更新内核别看&#xff0c;因为后面安装驱动报一堆错误!!! 不升级内核成功方法跳转连接&#xff1a;https://blog.csdn.net/weixin_53765004/article/details/138771613?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%2213877…

详解jmeter命令行参数的使用方法

相信大多数同学都通过命令行的方式使用过jmeter&#xff0c;因为在压测机是linux时&#xff0c;一般都是通过命令行的方式运行jmeter来进行压测的&#xff0c;本文会对这些命令行参数进行详解讲解。 如果大家还不了解如何在linux中运行jmeter&#xff0c;可以参考文章&#x…

哪些充电宝比较耐用?小米可以用什么充电宝、十大公认耐用充电宝

在现代社会的快节奏生活中&#xff0c;智能手机已经变得不可或缺。它不仅是我们的通讯工具&#xff0c;还是我们获取信息、娱乐休闲的重要设备。然而&#xff0c;当我们在外出、旅行或日常生活中频繁使用手机时&#xff0c;手机的续航问题常常让我们感到焦虑。为了解决这个问题…

C++ static_cast学习

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

CTF网络安全大赛web题目:just_sqli

这道题目是bugku的web题目 题目的 描  述: KosenCTF{} 原文链接&#xff1a; CTF网络安全大赛web题目&#xff1a;just_sqli - 红客网-网络安全与渗透技术 题目Web源代码&#xff1a; <?php$user NULL; $is_admin 0;if (isset($_GET["source"])) {highlig…

位图和布隆过滤器:位图

在《unordered_map 和 unordered_set》 中提到过&#xff1a; 哈希是一种思想&#xff0c;通过哈希函数将数据转化为一个或多个整型 —— 映射关系&#xff1b;通过这种映射关系&#xff0c;可以做到以 O(1) 的时间复杂度查找数据。 本文即将介绍的 位图 和 布隆过滤器 就是两个…

24长三角数学建模ABC题已出!!!

需要ABC题资料的宝子们可以进企鹅 赛题如下&#xff1a; 赛道 A&#xff1a;“抢救”落水手机 上有天堂&#xff0c;下在苏杭&#xff1b;五一假期&#xff0c;杭州西湖、西溪湿地、京杭大运河等著名 景点&#xff0c;游人如织&#xff0c;作为享誉国内外的旅游胜地&#xff0…

nc工具使用

12.nc工具使用 1.windows下安装使用nc 官网下载地址&#xff1a;netcat 1.11 for Win32/Win64 注意&#xff01;&#xff01;&#xff01; Windows系统会报病毒&#xff0c;如果有杀毒软件要全部关掉&#xff0c;自带的defender关掉或者弹出安全报警时选择执行允许&#xff0…