Розділ 2 · 16 питань

Патерни проектування

16 питань і відповідей у розділі Патерни проектування.

Ukrainian Патерни проектування Вихідний Markdown
Мовні версії: English Russian Ukrainian

Питання цього розділу

  1. Що таке патерни проектування?
  2. Які категорії патернів існують?
  3. Що таке Singleton?
  4. Як реалізувати потокобезпечний Singleton?
  5. Що таке double-checked locking?
  6. Які проблеми є у Singleton?
  7. В чому різниця між Factory Method та Abstract Factory?
  8. Коли використовувати Builder?
  9. Що таке патерн Prototype?
  10. Коли використовувати Strategy?
  11. Як Observer реалізований в Java?
  12. В чому перевага Decorator перед наслідуванням?
  13. В чому різниця між State та Strategy?
  14. Які типи Proxy існують?
  15. Що таке патерн Iterator?
  16. Які антипатерни ви знаєте?

Навігатор по розділу

16 запитань для підготовки до співбесіди на Middle Java Developer.


📋 Усі запитання

# Запитання Рівень складності
1 Що таке патерни проектування
2 Які категорії патернів існують
3 Що таке Singleton ⭐⭐
4 Як реалізувати потокобезпечний Singleton ⭐⭐⭐
5 Що таке double-checked locking ⭐⭐⭐
6 Які проблеми є у Singleton ⭐⭐
7 В чому різниця між Factory Method та Abstract Factory ⭐⭐
8 Коли використовувати Builder ⭐⭐
9 Що таке патерн Prototype ⭐⭐
10 Коли використовувати Strategy ⭐⭐⭐
11 Як Observer реалізований в Java ⭐⭐
12 В чому перевага Decorator перед наслідуванням ⭐⭐
13 В чому різниця між State та Strategy ⭐⭐⭐
14 Які типи Proxy існують ⭐⭐⭐
15 Що таке патерн Iterator ⭐⭐
16 Які антипатерни ви знаєте ⭐⭐

🗺️ Карта залежностей тем

                    ┌──────────────────────────────────────────┐
                    │   ОСНОВИ (1-2)                           │
                    │   1. Що таке патерни                     │
                    │   2. Категорії патернів                  │
                    └──────────────────┬───────────────────────┘
                                       │
            ┌──────────────────────────┼──────────────────────────┐
            ▼                          ▼                          ▼
    ┌───────────────┐        ┌───────────────┐        ┌────────────────────┐
    │ ПОРОДЖУЮЧІ     │        │ ПОВЕДІНКОВІ    │        │ СТРУКТУРНІ         │
    │ (3-9)          │        │ (10-11, 13)    │        │ (12, 14-15)        │
    │ 3. Singleton   │        │ 10. Strategy   │        │ 12. Decorator      │
    │ 4. Thread-safe │        │ 11. Observer   │        │ 14. Proxy          │
    │    Singleton   │        │ 13. State vs   │        │ 15. Iterator       │
    │ 5. DCL         │        │     Strategy   │        │                    │
    │ 6. Проблеми    │        │                │        │                    │
    │    Singleton   │        │                │        │                    │
    │ 7. Factory     │        │                │        │                    │
    │ 8. Builder     │        │                │        │                    │
    │ 9. Prototype   │        │                │        │                    │
    └───────────────┘        └───────────────┘        └────────┬───────────┘
                                                              │
                                                              ▼
                                                    ┌────────────────────┐
                                                    │ АНТИПАТЕРНИ (16)   │
                                                    │ 16. Антипатерни    │
                                                    └────────────────────┘

🎯 Рекомендований порядок вивчення

🟢 Рівень Junior (тижні 1-2)

Крок Тема Файли Мета
1 Що таке патерни Q1, Q2 Навіщо потрібні, категорії GoF
2 Singleton Q3 Один екземпляр, де використовується
3 Factory і Builder Q7, Q8 Створення об’єктів
4 Decorator і Iterator Q12, Q15 Огортання, перебір

🟡 Рівень Middle (тижні 3-4)

Крок Тема Файли Мета
1 Проблеми Singleton Q6 Тестованість, DI, масштабування
2 Strategy Q10 Коли використовувати, JIT оптимізації
3 Observer Q11 java.util.Observer deprecated, Flow API
4 Proxy Q14 JDK vs CGLIB, self-invocation

🔴 Рівень Senior (тижні 5-6)

Крок Тема Файли Мета
1 Thread-safe Singleton Q4, Q5 Bill Pugh, DCL, volatile, JMM
2 State vs Strategy Q13 State machine, transitions через Registry
3 Prototype Q9 clone() issues, copy constructors
4 Антипатерни Q16 God Object, Cargo Cult, Spaghetti

🔗 Ключові зв’язки між темами

Тема: Singleton

Q3 (Singleton) → Q4 (Thread-safe) → Q5 (DCL) → Q6 (Проблеми)

Ключові зв’язки:

  • Q4 ↔ Q5: DCL — один із способів thread-safe Singleton
  • Q6 ↔ Q3: DI-контейнер (Spring) вирішує проблеми Singleton

Тема: Породжуючі патерни

Q7 (Factory) → Q8 (Builder) → Q9 (Prototype)

Ключові зв’язки:

  • Q7 ↔ Q8: Factory = кілька способів створити, Builder = покрокове створення
  • Q8 ↔ Q9: Builder = конструювання, Prototype = копіювання

Тема: Поведінкові патерни

Q10 (Strategy) → Q11 (Observer) → Q13 (State vs Strategy)

Ключові зв’язки:

  • Q10 ↔ Q13: Strategy = алгоритм змінюється ззовні, State = стан змінюється зсередини
  • Q11 ↔ Q13: Observer = сповіщення підписників, State = делегування поведінки

Тема: Структурні патерни

Q12 (Decorator) → Q14 (Proxy) → Q15 (Iterator)

Ключові зв’язки:

  • Q12 ↔ Q14: Decorator додає поведінку, Proxy контролює доступ
  • Q14 ↔ Q6: Proxy вирішує проблеми Singleton (self-invocation, testability)

🎯 Шпаргалка: що знати для кожного рівня

🟢 Junior

  • Патерни — перевірені рішення типових завдань
  • 3 категорії: породжуючі, структурні, поведінкові
  • Singleton = один екземпляр, Factory = створення об’єктів
  • Builder = покрокове створення складних об’єктів

🟡 Middle

  • Bill Pugh Singleton = static inner class, thread-safe без synchronized
  • DCL = double check + volatile, оптимізація synchronized
  • DI-контейнер (Spring) вирішує проблеми Singleton
  • Strategy = алгоритм через інтерфейс, Observer = підписка на події
  • Decorator vs наслідування: n декораторів замість 2^n класів

🔴 Senior

  • JMM: volatile = happens-before гарантія, DCL без volatile = broken
  • Megamorphic call threshold = 5 в HotSpot, inline cache оптимізація
  • java.util.Observable deprecated (Java 9), використовувати Flow API
  • JDK Proxy ≈ CGLIB performance (JDK 8u40+), Spring Boot default = CGLIB
  • clone() обходить конструктор, copy constructor надійніший
  • State transitions через Registry/Factory, не через new State()

📝 Формат кожного файлу

Кожен файл містить:

  • 🟢 Junior Level — базове розуміння, прості аналогії, приклади
  • 🟡 Middle Level — нутрощі, типові помилки, практичні приклади
  • 🔴 Senior Level — deep dive, edge cases, production experience, monitoring
  • 🎯 Шпаргалка для інтерв’ю — ключові тези, часті запитання, червоні прапорці, пов’язані теми