1. Builder
Будівельник (Builder) — породжувальний шаблон проєктування, який надає спосіб створення складеного об'єкта.
Відокремлює конструювання складного об'єкта від його представлення таким чином, що в результаті того самого процесу конструювання можуть виходити різні уявлення.
Сильні сторони:
- дозволяє змінювати внутрішнє представлення продукту;
- ізолює код, що реалізує конструювання та подання;
- дає більш тонкий контроль за процесом конструювання.
Слабкі сторони:
- алгоритм створення складного об'єкта не повинен залежати від того, з яких частин складається об'єкт і як вони стикуються між собою;
- процес конструювання повинен забезпечувати різні представлення об'єкта, що конструюється.
Хороший приклад – це клас HttpRequest. У нього є підклас HttpRequest.Builder, за допомогою якого можна створювати екземпляри класу HttpRequest та гарантувати їхню валідність.
2. Lazy Initialization
Відкладена (лінива) ініціалізація (Lazy initialization) – прийом у програмуванні, коли певна ресурсомістка операція (створення об'єкта, обчислення значення) виконується безпосередньо перед тим, як буде використано її результат.
Отже ініціалізація виконується “на вимогу”, а не заздалегідь. Аналогічна ідея знаходить застосування в різних сферах: наприклад, компіляція "на льоту" і логістична концепція "Точно в термін".
Окремий випадок лінивої ініціалізації – створення об'єкта в момент звернення до нього – є одним із породжувальних шаблонів проєктування. Зазвичай він використовується в поєднанні з такими шаблонами як Фабричний метод, Одинак і Заступник.
Сильні сторони:
- Ініціалізація виконується лише у випадках, коли вона дійсно необхідна;
- Прискорюється початкова ініціалізація програми: усе, що можна відкласти, відкладаємо.
Слабкі сторони:
- Неможливо явно зазначити порядок ініціалізації об'єктів;
- Виникає затримка при першому зверненні до об'єкта, що може стати критичним при паралельному виконанні іншої ресурсомісткої операції. Через це потрібно ретельно прораховувати доцільність використання “лінивої” ініціалізації у багатопотокових програмних системах.
Пам'ятаєш, як під час написання web.xml там можна було вказати порядок старту сервлетів? Це і є наслідком лінивого завантаження. Tomcat створить об'єкти сервлетів при першому зверненні до них.
3. Object pool
Об'єктний пул (object pool) — породжувальний шаблон проєктування, набір ініціалізованих і готових до використання об'єктів. Коли системі потрібен об'єкт, він не створюється, а береться з пула. Коли об'єкт більше не потрібний, він не знищується, а не повертається до пулу.
Об'єктний пул застосовується для підвищення продуктивності, коли створення об'єкта на початку роботи і знищення його в кінці призводить до великих витрат. Особливо помітно підвищення продуктивності, коли об'єкти часто створюються та знищуються, але одночасно існує лише невелика їхня кількість.
Об'єктний пул зручний, якщо об'єкт володіє іншими ресурсами, крім пам'яті - наприклад, мережевими сокетами. Або якщо колекція об'єктів забирає значну частину пам'яті комп'ютера і сміття створюється дійсно багато.
Як ти пам'ятаєш, Tomcat виконує кожен запит окремого потоку. Але потоки не створюються щоразу заново, а зберігаються у пулі потоків. Це дозволяє швидше виконувати запити: коли потік потрібен, він просто береться з пула. До речі, питання: а як би ти помістив запущений потік у пул і взяв його з пула?
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ