设计模式-Builder和Factory模式区别

Builder和Factory模式区别

Builder模式结构:

 

Factory模式一进一出,Builder模式是分步流水线作业。
当你需要做一系列有序的工作或者按照一定的逻辑来完成创建一个对象时 Builder就派上用场啦。

我们可以看到,Builer模式与工厂模式是极为相似的,但是他们还是有区别的:

一、从结构上来看,Builder模式比工厂模式多了一个“导演类”的角色。
在Builder模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。

 

二、两者所创建的产品类型完全不一样。
Factory创建只能是单一的产品(单一在这指它非复合产品),而Builder所创建的产品是复合产品,即产品本身就是由其它部件产品组成的。

举个例子来说,现在要生产一辆车,假设它就只由这三个部分组成:玻璃、轮子、发动机。
对于工厂模式来说,他创建后返回的,只能是玻璃,或者轮子,抑或是发动机。
不管怎么样,他不能向客户返回一辆完整的汽车,要得到一辆完整的汽车,客户必须自己动手去把这些零部件组装成一辆汽车。
从这个意义上来讲,工厂模式中的工厂,只是充当了零件厂的角色。
那Builder又是如何创建产品的呢?在Builder模式中,一般不需要、也不充许向客户返回单个部件,他向客户返回的,仅仅就是一部已经完全组装好的汽车成品。
对于汽车部件的生产细节,客户不需要、也不应该让他们知道。

写到这,我突然想到了组装电脑与品牌电脑的差别,组装电脑虽然价格便宜,且易于改动,但性能没有保证,另外你自己还必须了解很多有关电脑方面的知识;对于品牌电脑,价格贵这点先暂时不说,关键在于他不灵活,但是它的性能可以得到很好保证(由厂家),这易像我们在Builder的系统端保证部件的质量一样。另外,对于品牌电脑,客户根本不需要了解多少电脑组装方面的知识,就可以把一台电脑抱回家,开机使用了。
那么,在实际运用中,你是喜欢做DIY一族呢,还是喜欢稳定有保证的质量呢?好像在我们编程的这个过程中,我们比较趋向于使用“品牌电脑”。这也就为我们正确使用这两种设计模式提供了一个方向:如果你要生产的产品是由不同部件组成的,你最好使用Builder模式,而非Factory模式。

三、Builder和Factory的差别,还在于他们所生产部件产品所在产品树的问题。
这样说,可能有点拗口。具体来说吧,在工厂模式中,我们知道,一个工厂可以创建多个产品,但一个工厂模式中所创建的某个产品,都会和另一个工厂中所创建的产品在同一棵继承树上。
Builder可以创建出可以创建出风马不相及的产品(虽然我们不这么做),但是Factory模式一般是创建一类产品。

 

转:https://www.cnblogs.com/yejg1212/archive/2013/02/25/2932526.html

转载于:https://www.cnblogs.com/jiangtao1218/p/10544474.html

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

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

相关文章

CodeForces - 766C - Mahmoud and a Message dp

题意 给出一个字符串 和每个字符的限制数量ai 让我们随意的切割成多个字符串 使得每一个字符串中的特定字符所在的子串长度len<ai 求一共有多少个符合题目要求的方案 求其中最长的一个串长度是多少 求其中最少能分成多少个串 长度最大为1000 分析 明显可以用搜索 不过复…

[剑指offer]面试题第[54]题[JAVA][二叉搜索树的第k大节点][递归][迭代]

【问题描述】[简单] 给定一棵二叉搜索树&#xff0c;请找出其中第k大的节点。示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4 示例 2:输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出: 4【解答思路】 反向中序遍历 遍历到第k个节点时&…

Hihocoder 1632 : Secret Poems 思维|技巧

题意 定义一个矩阵 他有n*n大小 然后给出他的真实信息的走法 让我们变换走法 再次把真实信息填入矩阵中 n<100 分析 可以发现原文的读取方式无非就是如此 &#xff08;0,1&#xff09;向左 (1,-1)左下 (1,0)向下 (-1,1)右上 1边界检查 (1,0)向下 (1,-1)左下 (0,…

[Leetcode][第108题][JAVA][将有序数组转换为二叉搜索树][二分法][递归]

【问题描述】[简单] 将一个按照升序排列的有序数组&#xff0c;转换为一棵高度平衡二叉搜索树。本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是&#xff1a;[0,-3…

CF Vicious Keyboard 构造水题

题目说 在给定字符串中 只能改变一个字符的情况下 求最大的VK字符的数量 分析 为了防止出错 这里要注意 为了防止VK判断的时候 不影响其他的判断 对于一个VK 我们最好不要把他删掉删掉后有可能会增加新的VK 就直接用特定值把原来的VK覆盖掉 然后对于剩下的可能 最多只能增…

数据结构:(1)课程总览

“数据结构”课程的内容 “数据结构”在计算机课程体系&#xff08;偏软&#xff09;中的地位 “数据结构”与程序设计类课程的关系 “数据结构”的学习目标 “数据结构”的学习方法

[剑指offer]面试题第[55-1]题[JAVA][二叉树的深度][BFS][DFS]

【问题描述】[简单] 输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度。例如&#xff1a;给定二叉树 [3,9,20,null,null,15,7]&#xff0c;3/ \9 …

[剑指offer]面试题第[55-2]题[Leetcode][第110题][JAVA][平衡二叉树][DFS][剪枝]

【问题描述】[中等] 输入一棵二叉树的根节点&#xff0c;判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1&#xff0c;那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7]3/ \9 20/ \15 7 返回 true 。示例 2:给定二叉树…

[Leetcode][第32题][JAVA][最长有效括号][动态规划][栈][正向逆向结合]

【问题描述】[困难] 给定一个只包含 ( 和 ) 的字符串&#xff0c;找出最长的包含有效括号的子串的长度。示例 1:输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2:输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"…

[剑指offer]面试题第[56-2]题[JAVA][数组中数字出现的次数][状态机][hashmap][位运算]

【问题描述】[中等] 在一个数组 nums 中除一个数字只出现一次之外&#xff0c;其他数字都出现了三次。请找出那个只出现一次的数字。示例 1&#xff1a;输入&#xff1a;nums [3,4,3,3] 输出&#xff1a;4 示例 2&#xff1a;输入&#xff1a;nums [9,1,7,9,7,9,7] 输出&…

Nginx多进程高并发、低时延、高可靠机制在缓存(redis、memcache)twemproxy代理中的应用...

1. 开发背景 现有开源缓存代理中间件有twemproxy、codis等&#xff0c;其中twemproxy为单进程单线程模型&#xff0c;只支持memcache单机版和redis单机版&#xff0c;都不支持集群版功能。 由于twemproxy无法利用多核特性&#xff0c;因此性能低下&#xff0c;短连接QPS大约为3…

[Leetcode][第44题][JAVA][通配符匹配][贪心][动态规划]

【问题描述】[困难] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 dp[i][j]dp[i][j] 表示字符串 ss 的前 ii 个字符和模式 pp 的前 jj 个字符是否能匹配 第 2 步&#xff1a;状态转移方程 第 3 步&#xff1a;考虑初始化 boolean[][] dp new boolean[m 1][n 1];…

annotation

Annotations提供一些本来不属于程序的数据。 注解(Annotation)相当于一种标记&#xff0c;在程序中加入注解就等于为程序打上某种标记&#xff0c;没有加&#xff0c;则等于没有任何标记&#xff0c;以后&#xff0c;javac编译器、开发工具和其他程序可以通过反射来了解你的类及…

43request对象 续

建立一个test.jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert title here…

wannafly挑战赛4 C-割草机 思维

时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 有一块n*m的地&#xff0c;每块地要么长满杂草(用’W’表示)&#xff0c;要么是空地(用’G’表示)&#xff0c;现在有一个…

[剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]

[剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 【问题描述】[简单] 输入一个递增排序的数组和一个数字s&#xff0c;在数组中查找两个数&#xff0c;使得它们的和正好是s。如果有多对数…