工厂与原型 - 何时使用?

时间:2013-11-18 08:35:31

标签: design-patterns factory

工厂和工厂原型有助于创建对象。在设计新应用程序时:

  1. 什么时候使用工厂模式而不是原型模式?
  2. 您何时会使用Prototype Pattern over Factory Pattern?
  3. 我很困惑哪一个用在哪里。

    我知道这可能是针对特定问题的,但是有没有一般的指导原则?

    思想?

5 个答案:

答案 0 :(得分:7)

我将假设您正在谈论抽象工厂设计模式(不应与工厂方法混淆,后者是另一种创造性设计模式)。

两者之间的差异并不太明显,因为它们可以重叠并以互补的方式使用。由于原型创建了自身的克隆,包括其所有属性,它通常只由一个抽象工厂创建一次,然后克隆每个必需的对象(不需要再次填充其字段)。

Prototype因此避免了不必要的“新”调用,因为克隆了对象并且没有创建。然而,在大多数现代OOP语言中,我不会说它是如此重要。我的两分钱:如果你没有真正看到差异,那就继续使用你习惯实施的那个(也就是抽象工厂)。

答案 1 :(得分:4)

我认为是,

在工厂方法中,我们返回我们感兴趣的新类型实例,在原型中相关的子类使用clone方法返回自身的实例

更具体的工厂方法创建是通过继承来实现的,就像通过委托创建原型一样,即多态

在我的观点中,

每当您认为需要一个类的重复状态或具有预设状态的对象的克隆时,您需要使用原型。

答案 2 :(得分:3)

Prototype最好被认为是一种优化Factory(复制而不是create)或执行依赖注入(为特定实现/配置配置工厂)的方法。

答案 3 :(得分:3)

正如我所看到的,虽然两者都是创作模式,但工厂和原型模式在不同的环境中使用。

工厂模式用于引入对象之间的松散耦合,因为工厂将处理从客户端隐藏它的所有实例化逻辑。

另一方面,当创建对象的成本很高并且复制现有实例而不是创建新实例时,可以使用原型模式。

答案 4 :(得分:0)

工厂模式基于明确定义的类层次结构创建对象。调用者可以传入参数,工厂使用它们来确定要创建哪些对象。原型模式在对象创建过程之上添加了一个额外的抽象层。使用原型模式,对象的创建(或克隆)基于运行时对象,而不仅仅是基于类层次结构。

  • 工厂模式:类层次结构 + 参数 + 程序逻辑 -> 实例化对象
  • 原型模式:类层次结构+参数+程序逻辑->实例化原型+参数+程序逻辑->创建/克隆对象

抽象工厂可以在幕后使用原型来增加其提供不同类实例的灵活性。

可以在此处找到原型模式的更详细说明:https://github.com/1gravity/design_patterns/tree/main/src/main/kotlin/com/onegravity/designpatterns/prototype