Опытный шаблон разработки, действительно просто клонируются?

Я нахожу coLinux чрезвычайно полезным при разработке под Windows для Linux, это в основном система linux, работающая параллельно вашей операционной системе Windows (то есть как служба), и ее можно настроить так, чтобы она просто отображалась в вашей локальной сети. в основном, как виртуальная машина. Кроме того, он гораздо более полнофункциональный, чем CygWin, и его производительность действительно замечательна - я могу легко запускать нетривиальные вещи в coLinux и по-прежнему запускать симуляторы со скоростью 90+ кадров в секунду.

Кроме того, coLinux можно легко настроить для запуска X11 и оконных менеджеров, таких как gnome / KDE, так что вы можете, например, использовать что-то вроде vnc для доступа к вашему рабочему столу linux.

Cooperative Linux - это первый работающий бесплатный метод с открытым исходным кодом для оптимальной работы Linux под Microsoft Windows. В более общем смысле, Cooperative Linux (сокращенное название coLinux) - это порт ядра Linux, который позволяет ему работать совместно с другой операционной системой на одной машине. Например, он позволяет свободно запускать Linux в Windows 2000 / XP без использования коммерческого программного обеспечения для виртуализации ПК, такого как VMware, гораздо более оптимальным способом, чем использование любого программного обеспечения для виртуализации ПК общего назначения.

colinux screenshot
(источник: colinux.org )

15
задан Dave Schweisguth 10 February 2016 в 05:00
поделиться

3 ответа

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

Паттерн Прототип включает клонирование специально для решения более крупной проблемы разделения создания объекта и использования объекта. Семантика прототипа утверждает, что единственный (или, по крайней мере, поддерживаемый / предпочтительный) метод для создания нового объекта требуемого поведения - это клонирование определенного экземпляра, известного как экземпляр прототипа. Эти экземпляры прототипов могут жить в фабрике прототипов, которая реализуется для создания новых экземпляров путем вызова 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;
}

Экземпляр этого factory можно передавать везде, где требуется 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;
}
18
ответ дан 1 December 2019 в 03:24
поделиться

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

4
ответ дан 1 December 2019 в 03:24
поделиться

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

0
ответ дан 1 December 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: