Реализация шаблона Builder C # против JAVA - PullRequest
3 голосов
/ 01 апреля 2012

Я видел реализацию шаблона Builder в JAVA, которая отличается от его версии на C # и "классической" иллюстрации книги Gang of Four.

C # - Версия Gang of Four

Director director = new Director(); 

Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();

Product p1 = director.Make(b1);
Product p2 = director.Make(b2)

JAVA - ссылка

Product p1 = new Product.Builder("p1").Name("Product1").Version("v1").Build();
Product p2 = new Product.Builder("p2").Name("Product2").Version("v2").Build();

Я впервые увидел JAVAиспользование, когда я входил в Android dev (как я пришел из мира .NET) - для меня версия JAVA более элегантна, чем ее аналог C #.

Теперь базовая реализация отличается, конечно, в примере JAVA Builderвложенный класс Product, а его метод Build () возвращает сконструированный экземпляр своего родительского класса;где, как C # интерпретация выше, больше похожа на Abstract Factory.

Со всем вышеупомянутым, оба, очевидно, являются 2 различными паттернами, хотя оба имеют структурный характер.Кто-нибудь знает, как называется второй пример в C #?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2012

это разные шаблоны, которые вы получили.

Первый (C #) - это построение сложных объектов

Второй (Java) метод построения объектов, без внешних конструкторов.

Итакэти две модели делали разные вещи и имеют разные области видимости

1 голос
/ 16 сентября 2013

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

  1. Это строит сложный объект продукта.
  2. Имеет свободный интерфейс .
  3. Он реализован как статический внутренний класс.

Я бы также предположил, что речь идет не о реализации C # или Java одного шаблона, а о двух различных шаблонах. Вы, вероятно, могли бы сказать, что любой тип компоновщика, то есть GOF / Classic или static-fluent , можно кодировать на любом языке, поскольку оба языка поддерживают необходимые функции. Можно также сказать, что версия со статической жидкостью получена из классической версии и, кроме того, имеет отношение к более общему шаблону компоновщика. Версия GOF может быть реализована в большинстве объектно-ориентированных языков, но статическая внутренняя часть более нового шаблона не поддерживается повсеместно, однако, как и в инициализаторах C #, упомянутых в другом ответе, вероятно, существуют специфические для языка способы достижения того же результата в других языках. а также.

Мне любопытно, почему бы не использовать объект-директор в статическом модуле построения, чтобы справиться с упорядочением и связанными с этим проблемами. Это причина его присутствия в паттерне GOF. Директор может быть статическим, а строитель может передаваться как параметр.

1 голос
/ 11 сентября 2013

Они оба считаются образцом Строителя, поскольку они являются всего лишь двумя способами достижения одной и той же цели. В своем посте вы привели пример GoF во фрагменте C #. Пример Java взят из «Эффективной Java» Джошуа Блоха. Основной причиной разницы является инкапсуляция. Другой - свободный интерфейс в стиле DSL, который у вас есть для создания объекта.

Ничто не мешает вам реализовать шаблон Builder в C #, как его описывает Блох (ну, почти ничего). В Java внешний класс может обращаться к закрытым полям вложенного класса. Это невозможно в .NET, поэтому вы должны следовать другому подходу. Обычно это делается путем копирования состояния объекта из компоновщика в новый экземпляр в методе Build.

...