Builder设计模式和Factory设计模式之间的区别是什么?
哪一种更有利?为什么?
如果我想测试和比较/对比这些模式,我如何将我的发现表示为图表?
Builder设计模式和Factory设计模式之间的区别是什么?
哪一种更有利?为什么?
如果我想测试和比较/对比这些模式,我如何将我的发现表示为图表?
当前回答
抽象工厂和生成器模式都是创造性模式,但目的不同。
抽象工厂模式强调为相关对象族创建对象,其中:
每个族都是从公共基类/接口派生的一组类。每个对象都会作为一次调用的结果立即返回。
构建器模式侧重于一步一步地构建一个复杂的对象。它将表示与构造复杂对象的过程解耦,以便相同的构造过程可以用于不同的表示。
Builder对象封装了复杂对象的配置。Director对象知道使用Builder的协议,其中协议定义了构建复杂对象所需的所有逻辑步骤。
其他回答
工厂模式在运行时创建一个类的具体实现,即它的主要目的是使用多态性来允许子类决定实例化哪个类。这意味着在编译时我们不知道将要创建的确切类,而Builder模式主要涉及解决伸缩构造函数反模式的问题,这是由于类的大量可选字段而产生的。在构建器模式中,没有多态性的概念,因为我们知道在编译时要构造什么对象。
这两种模式的唯一共同主题是在工厂方法和构建方法后面隐藏构造函数和对象创建,以改进对象构造。
生成器和抽象工厂有着不同的目的。根据正确的用例,您必须选择合适的设计模式。
生成器的显著特点:
生成器模式使用简单对象和分步方法构建复杂对象生成器类逐步构建最终对象。此生成器独立于其他对象在这种情况下替换为Factory方法/抽象工厂:从客户端程序传递给Factory类的参数太多,容易出错某些参数可能是可选的,不像工厂中强制发送所有参数
工厂(简单工厂)的显著特点:
创建型模式基于继承Factory返回一个Factory方法(接口),然后返回具体对象您可以用新的具体对象替换接口,客户端(调用者)不应该知道所有具体实现客户端始终只访问接口,您可以在Factory方法中隐藏对象创建详细信息。
通常,设计从使用工厂方法(不那么复杂,更可定制,子类激增)开始,并向抽象工厂、原型或生成器(更灵活,更复杂)发展
查看相关帖子:
将生成器保持在单独的类中(流畅的接口)
设计模式:工厂vs工厂方法vs抽象工厂
有关详细信息,请参阅以下文章:
资源制造
日志记录设备
构建器设计模式描述了一个对象,该对象知道如何在几个步骤中创建另一个特定类型的对象。它在每个中间步骤保持目标项所需的状态。想想StringBuilder是如何生成最终字符串的。
工厂设计模式描述了一个对象,该对象知道如何在一个步骤中创建几种不同但相关的对象,其中特定类型是基于给定参数选择的。想想串行化系统,在这里创建串行化器,它在一次加载调用中构造所需的in对象。
生成器模式和工厂模式看起来都很像肉眼,因为它们都为您创建对象。
但你需要仔细观察
这个现实生活中的例子将使两者之间的区别更加明显。
假设你去了一家快餐店,点了食物。
1) 什么食物?
披萨
2) 什么浇头?
辣椒,番茄,烤鸡,无菠萝
因此,不同种类的食物是通过工厂模式制作的,但特定食物的不同变体(口味)是通过构建模式制作的。
不同种类的食物
披萨、汉堡、意大利面
披萨的变体
只有奶酪、奶酪+番茄+辣椒、奶酪+西红柿等。
代码示例
您可以在这里看到这两种模式的示例代码实现生成器模式工厂模式
IMHO
Builder是某种更复杂的工厂。
但在Builder中,您可以使用另一个工厂来实例化对象,这是构建最终有效对象所必需的。
所以,谈论“创造性模式”的复杂性演变,你可以这样想:
Dependency Injection Container -> Service Locator -> Builder -> Factory