Является ли образец прототипа дизайна действительно клонированным?

Я занимаюсь углубленным изучением образцов дизайна, и я столкнулся с прототипом, который я действительно не изучал раньше. Я искал в Интернете и несколько книг, и нет действительно хорошего примера прототипа, который мог бы обнаружить, что это не просто клонирование. Является ли шаблон проектирования прототипа в основном языковой особенностью java и С# в качестве клона?

Ответы

Ответ 1

Шаблон Prototype намного больше, чем Clone. Семантика клона более широкая, что означает, что поля скаляров/значений одного экземпляра объекта дублируются в новом экземпляре, так что они имеют эквивалентное состояние, но занимают разные места в памяти. Клон может использоваться для поддержки множества различных потребностей.

Шаблон Prototype включает Clone специально для решения большей проблемы разделения конструкции объекта из использования объекта. Семантика прототипа утверждает, что единственный (или, по крайней мере, поддерживаемый/предпочтительный) метод для создания нового объекта требуемого поведения - это клонирование определенного экземпляра, известного как экземпляр прототипа. Эти экземпляры прототипов могут жить в прототипе factory, который реализован для создания новых экземпляров, вызывая Clone на экземплярах прототипов. Экземпляры прототипа могут быть инициализированы путем инъекции зависимостей. Код инъекции - это единственный код, который должен знать, как создавать экземпляры прототипа, и это фактически становится реальным кодом factory.

Надеюсь, следующий пример класса factory прояснит суть шаблона:

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;
}

Экземпляр этого factory может быть передан везде, где требуется IWidgetFactory. Преимущество состоит в том, что для каждого поведения вам не требуется куча разных классов factory. На самом деле, для определенных типов поведения вам даже не нужна группа разных классов, если вы просто вводите экземпляры того же типа, которые инициализируются по-разному в прототипе factory. В этом случае преимущество еще больше в том, что API не раздувается с кучей небольших классов, которые мало что делают.

Недостатком является то, что код инъекции должен знать, как построить прототипы. Это хрупкое, если в построении прототипов существует много сложной логики.

(Примечание. Шаблон Prototype не требует, чтобы все методы в прототипе factory возвращали один и тот же тип. Я просто сделал пример, возвращающий только Widgets, потому что это демонстрирует большее преимущество использования прототипов для создания объектов для определенного поведения объекты имеют один тип, но инициализированы по-разному.)

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;
}

Ответ 2

Сорт. Clone() многое делает для целей прототипа, но вы можете пойти гораздо дальше с шаблоном, если вам нужно. См. объяснение Steve Yegge (и длинное!) или изучите объектную модель Javascript.

Ответ 3

Клон() определенно является частью этого. Я думаю, что в шаблоне также говорится о том, что существуют способы собирать объекты, проходить через них и находить правильный клонировать. Вы также должны настроить объекты для начала.