18

我正在对设计模式进行深入研究,我遇到了原型,这是我以前没有真正研究过的。我已经搜索了网络和几本书,并且没有一个很好的原型示例可以找到不仅仅是克隆。原型的设计模式基本上是java和C#作为克隆的语言特性吗?

4

3 回答 3

19

原型模式远不止克隆。克隆语义更广泛,这意味着一个对象实例的标量/值字段在一个新实例中被复制,这样它们具有等效的状态但在内存中占据不同的位置。克隆可用于支持许多不同的需求。

Prototype 模式将 Clone 专门用于解决将对象构造与对象使用分离的更大问题。原型语义指出,构造具有所需行为的新对象的唯一(或至少支持/首选)方法是克隆特定实例,称为原型实例。这些原型实例可以存在于原型工厂中,该工厂通过在原型实例上调用 Clone 来实现创建新实例。原型实例可以通过依赖注入来初始化。注入代码是唯一需要知道如何构建原型实例的代码,这实际上成为了真正的工厂代码。

希望以下示例工厂类阐明了模式的症结:

public class PrototypeWidgetFactory : IWidgetFactory
{
  public PrototypeWidgetFactory(PrototypeWidget scenarioA, PrototypeWidget scenarioB, PrototypeWidget scenarioC) 
  {
    _scenarioA = scenarioA;
    _scenarioB = scenarioB;
    _scenarioC = scenarioC;
  }

  public Widget GetForScenarioA() { return _scenarioA.Clone(); }
  public Widget GetForScenarioB() { return _scenarioB.Clone(); }
  public Widget GetForScenarioC() { return _scenarioC.Clone(); }

  private PrototypeWidgetFactory _scenarioA;
  private PrototypeWidgetFactory _scenarioB;
  private PrototypeWidgetFactory _scenarioC;
}

可以在需要 IWidgetFactory 的任何地方传递此工厂的实例。优点是您不需要为每种行为使用一堆不同的工厂类。事实上,对于某些类型的行为,如果您只是将初始化不同的相同类型的实例注入原型工厂,您甚至不需要一堆不同的类。在这种情况下,优势就更大了,因为 API 不会因为一堆没有太多功能的小类而膨胀。

缺点是注入代码需要知道如何构造原型。如果在构建原型时涉及很多复杂的逻辑,这将是脆弱的。

(注意:原型模式并不要求原型工厂上的所有方法都返回相同的类型。我只是让示例只返回小部件,因为这展示了使用原型为特定行为构造对象时的更大优势类型,但初始化不同。)

public class PrototypeDomainFactory : IDomainFactory
{
  public PrototypeDomainFactory(PrototypePerson personPrototype, PrototypeCompany companyPrototype, PrototypeWidget widgetPrototype) 
  {
    _personPrototype = personPrototype;
    _companyPrototype = companyPrototype;
    _widgetPrototype = widgetPrototype;
  }

  public Person GetPerson() { return _personPrototype.Clone(); }
  public Company GetCompany() { return _companyPrototype.Clone(); }
  public Widget GetWidget() { return _widgetPrototype.Clone(); }

  private PrototypePerson _personPrototype;
  private PrototypeCompany _companyPrototype;
  private PrototypeWidget _widgetPrototype;
}
于 2009-10-13T23:37:44.240 回答
5

排序。 Clone()为原型目的做了很多你想要的事情,但如果你需要,你可以更进一步地使用该模式。请参阅Steve Yegge 的深入(而且冗长!)解释,或研究 Javascript 对象模型。

于 2009-10-13T21:34:53.327 回答
0

Clone() 绝对是其中的一部分。我认为该模式还谈到了收集对象、遍历它们并找到合适的克隆对象的方法。您还必须首先设置对象。

于 2009-10-13T21:33:34.827 回答