JavaRush/Курсы/JSP & Servlets/Порождающие паттерны, часть 2

Порождающие паттерны, часть 2

Открыта

4.1 Builder

Строитель (Builder) — порождающий шаблон проектирования, который предоставляет способ создания составного объекта.

Отделяет конструирование сложного объекта от его представления так, что в результате одного и того же процесса конструирования могут получаться разные представления.

Строитель (Builder)

Сильные стороны:

  • позволяет изменять внутреннее представление продукта;
  • изолирует код, реализующий конструирование и представление;
  • дает более тонкий контроль над процессом конструирования.

Слабые стороны:

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

Хороший пример – это класс HttpRequest, у него есть подкласс HttpRequest.Builder, с помощью которого можно создавать экземпляры класса HttpRequest и гарантировать их валидность.

4.2 Lazy Initialization

Отложенная (ленивая) инициализация (Lazy initialization) — приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат.

Таким образом инициализация выполняется “по требованию”, а не заблаговременно. Аналогичная идея находит применение в самых разных областях: например, компиляция “на лету” и логистическая концепция “Точно в срок”.

Lazy Initialization

Частный случай ленивой инициализации — создание объекта в момент обращения к нему — является одним из порождающих шаблонов проектирования. Как правило он используется в сочетании с такими шаблонами, как Фабричный метод, Одиночка и Заместитель.

Сильные стороны:

  • Инициализация выполняется только в тех случаях, когда она действительно необходима;
  • Ускоряется начальная инициализация приложения: все, что можно отложить, откладываем.

Слабые стороны:

  • Невозможно явным образом задать порядок инициализации объектов;
  • Возникает задержка при первом обращении к объекту, что может оказаться критичным при параллельном выполнении другой ресурсоёмкой операции. Из-за этого требуется тщательно просчитывать целесообразность использования “ленивой” инициализации в многопоточных программных системах.

Помнишь, как при написании web.xml там можно было указать порядок старта сервлетов? Это как раз и есть следствие ленивой загрузки. Tomcat создаст объекты сервлетов при первом к ним обращении.

4.3 Object pool

Объектный пул (object pool) — порождающий шаблон проектирования, набор инициализированных и готовых к использованию объектов. Когда системе требуется объект, он не создаётся, а берётся из пула. Когда объект больше не нужен, он не уничтожается, а возвращается в пул.

Object pool

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

Объектный пул удобен, если объект владеет другими ресурсами, кроме памяти — например, сетевыми сокетами. Либо если коллекция объектов отнимает значительную часть памяти компьютера и “мусора” создаётся действительно много.

Как ты помнишь, Tomcat выполняет каждый запрос в отдельном потоке. Но потоки не создаются каждый раз заново, а хранятся в пуле потоков. Это позволяет быстрее выполнять запросы: когда поток нужен, он просто берется из пула. Кстати, вопрос: а как бы ты поместил запущенные поток в пул и взял его из пула?

Комментарии (9)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Пётр
Уровень 89
3 октября 2025, 00:41
Задачи интересные, информации много. Как это все уложить в голову ума не приложу. Последняя задача хорошая 😀
Антон
Уровень 88
27 марта 2025, 19:12
Если бы заранее не знал как реализован НОРМАЛЬНЫЙ билдер, решая эту задачу и не узнал бы)
Олег
Уровень 106
Expert
9 сентября 2024, 17:48
уфф, очень много информации.
Иван КорниенкоБэтмен в Готэме
20 июня 2024, 12:29
Невозможно явным образом задать порядок инициализации объектов;
Через несколько строк:
Помнишь, как при написании web.xml там можно было указать порядок старта сервлетов? Это как раз и есть следствие ленивой загрузки.
То есть порядок инициализации объектов задать все-таки можно? Че происходит вообще
hint1k
Уровень 51
4 мая 2023, 18:35
Поржал над
логистическая концепция “Точно в срок”
я понимаю что в русскоязычной википедии так написано. Но википедии вообще полно ошибок. Just in time - это производственный принцип и часть стратегии бережливого производства. К логистике никакого отношения не имеет. JIT - изобретение сделанное производственной компанией Тойота. И смысл его заключается в том, что в тот момент когда заводу или процессу или операции нужны запчасти, он заставляет предыдущий завод/предыдущий производственный процесс/предыдущую операцию произвести запчасти в нужном количестве именно в момент когда они понадобились, а не скажем за месяц до этого. Экономя тем самым денежные и другие ресурсы, которые были бы потрачены на хранение ненужной продукции в течении этого месяца.
Александр
Уровень 111
Expert
31 октября 2022, 14:37
Последняя задача hard. Даже забыл про метод offer у Queue или даже не знал про него вовсе. Помню: add peek, poll
Александр Ц. System Engineer Expert
26 октября 2022, 08:58
Задача "Ленивый зам": в условиях не указано изменить id на 10001.
СергейРаботает в ITQ-GroupExpert
14 ноября 2022, 16:41
Так и не пофиксили, может кому пригодится: Вместо new LazyInitializer(100001); нужно писать new LazyInitializer(10001);
Oleg Khilko
Уровень 51
15 августа 2022, 16:25
Lazy Initialization == @Lazy в Спринге, очень классная аннотация для получения ракетницы Шварца right in time)