Builder设计模式和Factory设计模式之间的区别是什么?
哪一种更有利?为什么?
如果我想测试和比较/对比这些模式,我如何将我的发现表示为图表?
Builder设计模式和Factory设计模式之间的区别是什么?
哪一种更有利?为什么?
如果我想测试和比较/对比这些模式,我如何将我的发现表示为图表?
当前回答
区别很明显在生成器模式中,生成器将为您创建特定类型的对象。你必须告诉我什么建筑商必须建造。在工厂模式中,使用抽象类可以直接构建特定对象。
在这里,生成器类充当主类和特定类型类之间的中介。更抽象。
其他回答
逐步构建复杂对象:构建器模式通过使用单一方法创建一个简单对象:工厂方法模式使用多工厂方法创建对象:抽象工厂模式
生成器和抽象工厂生成器设计模式在某种程度上与抽象工厂模式非常相似。这就是为什么在使用其中一种或另一种情况时,能够区分不同的情况是很重要的。在抽象工厂的情况下,客户端使用工厂的方法来创建自己的对象。在Builder的例子中,Builder类被指示如何创建对象,然后被要求创建对象,但是类的组合方式取决于Builder类,这一细节决定了两种模式之间的区别。产品通用接口在实践中,由混凝土建设者创建的产品具有明显不同的结构,因此如果没有理由派生不同的产品,则生成一个公共的父类。这也将生成器模式与抽象工厂模式区分开来,抽象工厂模式创建从公共类型派生的对象。
发件人:http://www.oodesign.com/builder-pattern.html
这两种模式都有相同的必要性:对某些客户端代码隐藏复杂对象的构造逻辑。但是,是什么使一个对象变得“复杂”(或有时变得复杂)?主要是由于依赖关系,或者更确切地说是由更多部分状态组成的对象的状态。您可以通过构造函数注入依赖项来设置初始对象状态,但一个对象可能需要很多依赖项,其中一些依赖项将处于默认初始状态(只是因为我们应该了解到,将默认依赖项设置为null不是最干净的方式),而另一些依赖项则设置为由某种条件驱动的状态。此外,有些对象财产是某种“不经意的依赖关系”,但它们也可以假定为可选状态。
有两种众所周知的方法来控制这种复杂性:
组合/聚合:构造一个对象,构造其依赖对象,然后连接在一起。在这里,构建器可以使确定引导组件构建的规则的过程透明而灵活。多态性:构造规则直接声明到子类型定义中,因此每个子类型都有一组规则,某些条件决定了这些规则中的哪一个适用于构造对象。工厂完全适合这种情况。
没有什么可以阻止这两种方法的混合。一个产品系列可以抽象对象创建,由生成器完成,生成器可以使用工厂来确定实例化哪个组件对象。
Factory模式几乎可以看作是Builder模式的简化版本。
在Factory模式中,工厂负责根据需要创建对象的各种子类型。
工厂方法的用户不需要知道该对象的确切子类型。工厂方法createCar的示例可能返回Ford或Honda类型的对象。
在生成器模式中,不同的子类型也由生成器方法创建,但同一子类中对象的组成可能不同。
要继续汽车示例,您可能需要一个createCarbuilder方法,该方法创建一个带有4缸发动机的Honda类型的对象,或者一个带有6缸的Honda型对象。构建器模式允许这种更精细的粒度。
生成器模式和工厂方法模式的图表都可以在维基百科上找到。
首先,要遵循我的论证:
设计大型软件系统的主要挑战是它们必须灵活且不复杂地进行更改。出于这个原因,有一些度量,如耦合和内聚。为了实现可以轻松更改或扩展其功能而无需从头设计整个系统的系统,您可以遵循设计原则(如SOLID等)。过了一段时间,一些开发人员意识到,如果他们遵循这些原则,就会有一些类似的解决方案可以很好地解决类似问题。这些标准解决方案被证明是设计模式。
因此,设计模式支持您遵循一般设计原则,以实现具有高内聚性的松散耦合系统。
回答问题:
通过询问两种模式之间的差异,你必须问问自己,哪种模式使你的系统更灵活。每个模式都有自己的目的来组织系统中类之间的依赖关系。
抽象工厂模式:GoF:“提供一个接口来创建相关或依赖对象的族,而不指定它们的具体类。”
这意味着什么:通过提供这样的接口,对每个系列产品的构造函数的调用被封装在工厂类中。因为这是整个系统中唯一调用这些构造函数的地方,所以可以通过实现新的工厂类来更改系统。如果您通过另一个交换工厂的表示,则可以在不接触大部分代码的情况下交换一整套产品。
生成器模式:GoF:“将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。”
这意味着什么:您将构建过程封装在另一个类中,称为director(GoF)。该导向器包含创建产品新实例的算法(例如,用其他部件组成一个复杂的产品)。为了创建整个产品的组成部分,导演使用了一个生成器。通过在director中交换生成器,您可以使用相同的算法来创建产品,但更改单个零件的表示(以及产品的表示)。要在产品的表示中扩展或修改系统,只需实现一个新的生成器类。
简而言之:抽象工厂模式的目的是交换一组共同使用的产品。生成器模式的目的是封装创建产品的抽象算法,以将其用于产品的不同表示。
在我看来,你不能说抽象工厂模式是生成器模式的大哥。是的,它们都是创造模式,但模式的主要意图完全不同。