当前位置: 首页 > news >正文

设计模式学习之生成器模式

UML结构类图的常用画法

简单工厂

设计模式学习之外观模式

设计模式学习之适配器模式

设计模式学习之单例模式

设计模式学习之工厂方法模式

Demo传送门

案例:关于导出数据的的应用框架,可以导出成文本格式,XML格式,Excel格式等。对于导出的文件中主要分为以下三个部分: 头文件:主要描述信息是分公司或者门市点编号,导出数据的日期,文本格式中间用逗号分离 文件主体部分:包括表名称,分条描述数据,对于文本格式,表名称独占一行,数据描述一行算一条数据,字段间用逗号分隔 文件尾部:主要是输入人。

下面为了突出生成器模式,我们先用一般的方法来解决:

1.一般方法

首先来定义header,data,footer的数据源

之后看下ExportToTxt和ExportToXML的实现

客户端调用

运行结果

从上面的结构可以看出,导出Txt或者XML都需要拼接头,主体和尾部内容,完了会输出成为文件,对于不同的输出格式,步骤都是一样的,但是以上述方法存在以下问题:

1.重复处理步骤 2.不利于扩展其他格式的文件

理想中的状态应该是构建每种格式的数据文件处理过程和具体的实现步骤应该是分开的,这样可以很好地切换不同的文件格式,那么这样该如何实现呢?下面就进入生成器模式的学习。

2.认识生成器模式

定义

将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示

生成器模式的结构类图

对于上图中的结构元素的功能说明:

  • Builder:生成器接口,定义创建一个Product对象所需的各个部件的操作
  • ConcreteBuilder:具体生成器的实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时提供一个获取组装完成后的产品对象的方法。
  • Director:指导者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象
  • Product:产品,表示被生成器构建的复杂对象,包含多个部件

针对案例,用生成器模式来写,具体如下:

具体步骤如下:

1.规定协议规范,也就是builder

2.实现Builder的具体产品,这里分为TxtBuilder,XMLBuilder

3.组合类,也就是Director,主要是组装各个部件

4.客户端调用

从上述已经可以很清楚的明白生成器的实现结构和模式,主要就是对同一个构建过程,配置不同的生成器实现,就会生成不同的表现。

生成器模式有以下优点

  • 松散耦合,将产品的构建和表现完全分离,将构建过程独立出来,使得构建算法可复用,具体表现可以灵活方便地扩展和切换

  • 可以很容易地改变产品的内部表示

  • 具有更好的复用性

生成器模式的本质就是分离整体构建算法和部件构造,那么使用该模式的场景如下:

  • 如果创建对象的算法,应该独立于该对象的组成部分以及它们的装配方式时
  • 如果同一个构建过程有着不同的表示时

相关文章:

  • SSH项目的简单table及其分页框架
  • .NET 事件模型教程(二)
  • SUP (SAP Mobile SDK 2.2) 连接 Sybase SQL Anywhere sample 数据库
  • 流的压缩与解压缩函数
  • Javascript 严格模式详解(转)
  • AngularJS的Hello World
  • 日志池
  • 电子病历,到底是用BS还是CS
  • Visual Studio (VSIX,项目模板 )制作
  • C#下实现的半角转与全角的互转
  • shell训练营Day19
  • 创建使用口令的角色,并分配给用户
  • 当Json数据中的key为Java关键字时,在定义实体类的时候不能对该字段进行声明,所以需要对字段进行特殊处理...
  • day16:计算文档中数字|检测两个文件的不同|检测网卡流量|批量杀死sh|检测是否开启80和是什么服务...
  • ruby多线程理解
  • Angular6错误 Service: No provider for Renderer2
  • Cookie 在前端中的实践
  • Leetcode 27 Remove Element
  • scala基础语法(二)
  • Swoft 源码剖析 - 代码自动更新机制
  • Webpack 4x 之路 ( 四 )
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 简单实现一个textarea自适应高度
  • 精彩代码 vue.js
  • 前言-如何学习区块链
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 新手搭建网站的主要流程
  • 译米田引理
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 从如何停掉 Promise 链说起
  • #LLM入门|Prompt#3.3_存储_Memory
  • (3)选择元素——(17)练习(Exercises)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (笔试题)分解质因式
  • (二)hibernate配置管理
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (转)Linux下编译安装log4cxx
  • (转)Linux整合apache和tomcat构建Web服务器
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 反射 Reflect
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @Valid和@NotNull字段校验使用
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [04]Web前端进阶—JS伪数组
  • [1525]字符统计2 (哈希)SDUT
  • [ACTF2020 新生赛]Upload 1
  • [Android View] 可绘制形状 (Shape Xml)
  • [Asp.net mvc]国际化
  • [Bugku]密码???[writeup]
  • [bzoj1912]异象石(set)
  • [leetcode] Balanced Binary Tree