Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >生成器模式(Builder)

生成器模式(Builder)

作者头像
Florian
发布于 2018-02-05 03:34:15
发布于 2018-02-05 03:34:15
6200
举报
文章被收录于专栏:技术点滴技术点滴

生成器模式(Builder)

生成器模式(Builder)

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

应用编译器词法分析器指导生成抽象语法树、构造迷宫等。

模式结构

心得

和工厂模式不同的是,Builder模式需要详细的指导产品的生产。指导者(Director)使用Construct方法构造产品BuilderProduct,但是它不直接参与构造过程,而是把构造的任务交给生成器(Builder)。Builder提供了产品每一个部件构造的实现方法(可以是默认实现),但是如果要获得最终的产品,需要派生Builder的子类,添加getResult方法返回最终的产品对象。BuildPart方法正是被指导者调用指挥产品生产流程的接口。

举例

编译器中词法分析器为语法分析器提供基本的词法记号,这时可以将词法分析器看作一个指导者(Director),语法分析是为了获得一个语法树。词法分析器每次识别出一个词法结构时都会通知语法分析器,要求它做相应的语法结构匹配,直至最后生成最终的抽象语法树。这里使用一个简单词法分析的例子来说明Builder模式的实现:

代码语言:js
AI代码解释
复制
//生成器接口
class Builder
{
protected:
    Builder(){}
public:
 virtual void addIntToken(){}
 virtual void addIdentToken(){}
 virtual void addSemiconToken(){}
 virtual ~Builder(){}
};
//抽象语法树
class Tree
{
public:
 void addNode(char*p)
    {
        cout<<"添加了一个"<<p<<"节点"<<endl;
    }
 void display()
    {
        cout<<"一颗完整的语法树"<<endl;
    }
};
//抽象语法树生成器
class SemanticTreeBuilder:public Builder
{
    Tree tree;
public:
    SemanticTreeBuilder(){}
 virtual void addIntToken()
    {
        tree.addNode("<Int>");
    }    
 virtual void addIdentToken()
    {
        tree.addNode("<标识符>");
    }
 virtual void addSemiconToken()
    {
        tree.addNode("<分号>");
    }
    Tree getTree()
    {
 return tree;
    }
};
//标识符个数生成器
class IdentCountBuilder:public Builder
{
 int num;
public:
    IdentCountBuilder():num(0){}
 virtual void addIdentToken()
    {
        num++;
    }
 int getIdCount()
    {
 return num;
    }
};
//词法分析器
class Parser
{
public:
 //使用生成器生成对象
 void Conctruct(Builder*builder)
    {
        builder->addIntToken();
        builder->addIdentToken();
        builder->addSemiconToken();
    }
};

这里构造了两个生成器,一个用来生成抽象语法树,一个用来统计标识符的个数【先不考虑实际意义】。它们重写了标准接口定义的函数,并提供了自身的实现。前者返回抽象语法树对象,后者返回标识符个数。用户使用代码形式具有一致性和简洁性:

代码语言:js
AI代码解释
复制
Parser par;//词法分析器
SemanticTreeBuilder treeBuilder;//语法树生成器
par.Conctruct(&treeBuilder);//构造语法树
Tree tree=treeBuilder.getTree();//获取构造的语法树
tree.display();//显示语法树
IdentCountBuilder idBuilder;//标识符个数生成器
par.Conctruct(&idBuilder);//获取标识符个数
cout<<"标识符个数="<<idBuilder.getIdCount()<<endl;//输出个数

使用Builder模式,可以通过改变接口的调用创建同类不同的产品,也可以改变Builder子类创建完全不同类的产品,并且保证用户能控制产品生产的细节和流程。

参考文章http://blog.csdn.net/ldblog/article/details/2845591

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-12-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[WebKit] JavaScriptCore解析--基础篇(一)字节码的生成及抽象语法树的构建详情分析
看到HorkeyChen写的文章《[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现》,写的很好,深受启发。想补充一些Horkey没有写到的细节比如字节
程序员互动联盟
2018/03/12
1.6K0
[WebKit] JavaScriptCore解析--基础篇(一)字节码的生成及抽象语法树的构建详情分析
java实现编译器_实现一个简单的编译器
简单的说 编译器 就是语言翻译器,它一般将高级语言翻译成更低级的语言,如 GCC 可将 C/C++ 语言翻译成可执行机器语言,Java 编译器可以将 Java 源代码翻译成 Java 虚拟机可以执行的字节码。
全栈程序员站长
2022/09/08
2.8K0
java实现编译器_实现一个简单的编译器
再看编译原理
其实就是翻译,比如从字符串编译到机器码,就是把人能理解的代码语言翻译成机器能“理解”(识别执行)的机器语言,然后用户借助目标程序就可以与机器交互了:
ayqy贾杰
2019/06/12
9260
简单学习下Java的编译过程
打开CMD,运行javac HelloWorld.java,得到一个对应的class文件
晓果冻
2022/09/08
3160
简单学习下Java的编译过程
为什么编译原理被称为龙书?
这本书很有意思,它的书名是 《Compilers: Principles, Techniques, and Tools》,也就是编译器的原则、技术和工具。但它却画出了一个恐龙和骑士,恐龙身上写的是 Complexity of Compiler Design,也就是复杂的编译器设计,骑士的盾上写的是 Syntax Directed Granslation,也就是语法翻译。骑士的剑上看的不是很清楚,我猜测应该是优秀的编译器的意思。这是征服复杂性的隐喻。优秀的编译器会直接征服复杂的编译,复杂的编译设计永远无法攻破语法翻译。
cxuan
2020/07/17
1.4K0
hiphop原理分析1
Hiphop是Facebook开发一款PHP二进制化的一个工具,最开始是由php转为C++,但是后来发现编译为c++的话,许多的时间会花费在编译代码上面,调试不方便,对于代码来说也不是即见即所得。 所以hiphop经历了这么几个阶段: HPHPC=>HPHPI=>HHVM HPHPC是静态编译,也就是把php转为c++ HPHPI是一个过渡产品,类似php zend虚拟机,性能还不如zend虚拟机,但是可以运行查看效果; HHVM是在HPHPI基础上,应用了JIT技术,性能已经接近了HPHPC,目前face
小小科
2018/05/02
1.5K0
hiphop原理分析1
生成器模式与原型模式C++实现
生成器模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
里克贝斯
2021/05/21
5900
生成器模式与原型模式C++实现
我写了一个编程语言,你也可以做!
各位好。我一直在专注于开发一个称为“Pinecone”的语言,已经持续6个月的时间。
用户9861443
2024/04/15
2150
我写了一个编程语言,你也可以做!
Calcite系列(六):执行流程-语法解析
目前广泛使用的语法解析框架主要包括ANTLR、JavaCC和Yacc等。在大数据领域中,很多计算引擎都是基于ANTLR进行语法解析,例如 Hive、Spark和Presto等都基于ANTLR进行处理。然而,Calcite使用JavaCC编译器进行语法解析。
Yiwenwu
2024/04/19
9460
Calcite系列(六):执行流程-语法解析
java编译原理
(1)javac是一种编译器,能够将一种语言规范转换成另一种用语言规范,通常编译器是将便于人们理解的语言规范成机器容易理解的语言规范。
全栈程序员站长
2022/08/25
1.9K0
如何实现一个SQL解析器
随着技术的不断的发展,在大数据领域出现了越来越多的技术框架。而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进行数据查询。SQL作为一个学习成本很低的语言,支持SQL进行数据查询可以降低用户使用大数据的门槛,让更多的用户能够使用大数据。
2020labs小助手
2022/10/24
2.8K0
前端工程师为什么要学习编译原理?
普遍的观点认为,前端就是打好 HTML、CSS、JS 三大基础,深刻理解语义化标签,了解 N 种不同的布局方式,掌握语言的语法、特性、内置 API。再学习一些主流的前端框架,使用社区成熟的脚手架,即可快速搭建一个前端项目。胜任前端工作非常容易。再往深处学习,你会发现前端这个领域,总是有学不完的框架、工具、库,不断有新的轮子出现。技术推陈出新,版本快速迭代,但万变不离其宗。工具致力于流程自动化、规范化,服务于简洁、优雅、高效的编码,将问题高度抽象化、层次化。在如今前端开源界如此火热的现状下,框架的使用者与框架的维护者联系更加紧密,不仅能深入源码来更彻底地认识框架,还能够提出问题,参与讨论,贡献代码,共同解决技术问题,推进前端生态的发展和壮大。而编译原理,作为一门基础理论学科,除了 JS 语言本身的编译器之外,更成为 Babel、ESLint、Stylus、Flow、Pug、YAML、Vue、React、Marked 等开源前端框架的理论基石之一。了解编译原理能够对所接触的框架有更充分的认识。
Nealyang
2019/09/29
1.6K0
前端工程师为什么要学习编译原理?
编译阶段完成的任务
源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 连接器 (Linker) → 可执行程序 (executables)
opencode
2022/12/26
4400
Java文件是怎么编译成Class文件的
其实就是我们前端的编译过程,是通过javac(编译器)把java文件变成.class字节码文件。
向着百万年薪努力的小赵
2022/12/02
1.4K0
Java文件是怎么编译成Class文件的
夯实基础,编译器原理前端部分浅析
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情
掘金安东尼
2022/09/22
5990
夯实基础,编译器原理前端部分浅析
HiveSQL源码之语法词法编译文件解析一文详解
工欲善其事必先利其器,首先要了解HiveSQL的编译语法的流程,还是需要懂得HiveSQL的执行流程以及编译规则。曾经在Hive数仓搭建的时候写过部分HiveSQL编译原理:
fanstuck
2024/12/25
3750
HiveSQL源码之语法词法编译文件解析一文详解
深入解析 Java 中的 SQL 解释器树设计与实现
这里先给大家推荐一篇实用的好文章:《全面解锁 SpringBoot 集成 Mybatis-Plus!从 LambdaQueryWrapper 到测试用例的实战指南》 来自作者:bug菌
喵手
2024/11/23
2810
深入解析 Java 中的 SQL 解释器树设计与实现
编译原理工程实践—01编译器前端技术核心三步
什么是编译器的前端技术?我们在大学课堂里学习的《编译原理》大多侧重讲解编译器的 "前端(Front End)" 技术,即编译器对程序代码的分析和理解过程。而与之对应的 "后端(Back End)" 则是生成目标代码和优化的过程,跟目标机器有关。
CS逍遥剑仙
2025/05/12
1210
《Kotlin 程序设计》第七章 Kotlin 编译过程分析第七章 Kotlin 编译过程分析
http://mp.weixin.qq.com/s/lEFRH523W7aNWUO1QE6ULQ
一个会写诗的程序员
2018/08/17
1.8K0
编译器架构 ( Compiler Architecture )
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:
一个会写诗的程序员
2021/06/29
1.9K0
相关推荐
[WebKit] JavaScriptCore解析--基础篇(一)字节码的生成及抽象语法树的构建详情分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档