Table of Contents

Розуміння трьох основних шаблонів

Патерни проектування програмного забезпечення - це бойові креслення для вирішення проблем з проектування. Серед найбільш часто використовуваних - це створення шаблонів - Сінглеттон, завод і Прототип - вчитель, що регулює, як об'єкти миттєвоуються. Вибір права, який безпосередньо впливає на збереження коду, продуктивність і масштабованість. Цей розширений посібник поглиблюється в кожен шаблон, досліджує реальні світові сценарії, і забезпечує дієві критерії, щоб допомогти вам зробити поінформоване рішення.

Одиночний візерунок: один намір до обрізання ем все

Патерн Oneton забезпечує клас, який має саме одну екземпляр і забезпечує глобальний доступ до неї. Це один з найпростіших шаблонів, але це часто невикористано. Основна ідея полягає в тому, щоб контролювати процес миттєвого відбиття, щоб не було того, скільки разів запитується клас, той же об'єкт повертається.

Як працює однотонна

Зазвичай, однотонний клас має приватний конструктор і статичний метод, який повертає екземпляр. Перший виклик створює об'єкт; наступні дзвінки повторюють той самий екземпляр. У багатопрочитаних середовищах синхронізація потрібна для запобігання умов рас, які можуть створити кілька екземплярів.

public class DatabaseConnectionPool {
 private static DatabaseConnectionPool instance;
 private DatabaseConnectionPool() { /* initialization */ }
 public static synchronized DatabaseConnectionPool getInstance() {
 if (instance == null) {
 instance = new DatabaseConnectionPool();
 }
 return instance;
 }
}

Коли Шини однотонні

  • Управління загальними ресурсами: Басейн з'єднання, послуги з реєстрації або налаштування менеджера переваги з однієї точки узгодження.
  • Глобальна держава:] Коли потрібен постійний доступ до програми, що вимагає певного облікового запису.
  • Hardware або OS-рівневі ресурси: Файлові системи, принтери баскерів, або вікна менеджерів, як правило, дозволяють тільки один екземпляр.

Загальні Питви, щоб уникнути

  • Overuse: Використання Singleton для всіх призводить до прихованих залежностей і робить тестування блоку важко, тому що ви не можете легко замінити екземпляр з родком.
  • Thread-safety overhead: Класичний синхронізований метод може стати пляшковим вирізом. Альтернативи, такі як ініціалізація торрента або подвійне замка (з волей) зменшити вміст.
  • Tight coupling: Оскільки глобальний точка доступу є жорстко-кодованим, клієнти поєднуються з конкретним класом Oneton, що порушує Принцип дії залежностей.

Незважаючи на ці недоліки, Oneton залишається корисним, коли вам дійсно потрібно один, глобально доступний об'єкт. Для більш глибокого розуміння див. ]Рефакторинг посібника з Єдиного вакансія Гуру.

Фабричний візерунок: Делегування створення об'єктів

Патерн Фабричний енкопсує логіку миттєвого відключення об'єкта, що дозволяє підкласам вирішувати, який клас миттєво. Він поставляється в двох основних ароматах: Факторний метод] (єдиний метод, який повертає нові об'єкти) і Abstract Factory (сім'я суміжних методів фабрики). Обидва декупрують код клієнта з конкретних класів, що сприяють розпушуванню та легкої екстензивності.

Фабричний метод в докладному режимі

Визначте інтерфейс для створення об'єкта, але дозвольте підкласи змінювати тип об'єктів, які будуть створені. Наприклад, діалоговий клас може мати метод . Підкласи, такі як WindowsDialog і LinuxDialog, наділені цим методом для повернення платформи конкретні кнопки.

abstract class Dialog {
 abstract Button createButton();
 public void render() {
 Button okButton = createButton();
 okButton.onClick();
 }
}
class WindowsDialog extends Dialog {
 Button createButton() { return new WindowsButton(); }
}

Цей візерунок ідеально підходить для:

  • Клас не може передбачати клас об'єктів, які він повинен створити.
  • Ви хочете локалізувати логіку створення об'єкта в одному місці.
  • Система повинна бути незалежною від того, як об'єкти його будуються.

Абстрактний завод: Виробляючи сім'ї суміжних об'єктів

Абстрактний завод надає інтерфейс для створення сімей пов'язаних або залежних об'єктів без визначення їх конкретних класів. Думайте про інструментарію GUI, які повинні виробляти кнопки, прапорці та прокрутки, які виглядають послідовно під даній темі (наприклад, матеріал, Cupertino). Клієнт використовує абстрактний заводський інтерфейс для отримання продуктів, а бетонні фабрики (MaterialFactory, CupertinoFactory) генерують правильні варіанти.

Цей візерунок краще, коли:

  • Система повинна бути налаштована з одним з декількох сімей продукції.
  • Ви хочете дотримуватися консистенції серед продуктів.
  • Додаючи нові сімейства продуктів, необхідно мінімально змінюватися до існуючого коду.

Випадкування між заводом та іншими візерунками

Завод є вашим go-to, коли створення об'єкта є складним або коли вам потрібно закрутити виконання в режимі runtime. Він більш гнучкий, ніж Singleton, тому що він не обмежує кількість екземплярів - це тільки центральне створення. На відміну від прототипу завод створює нові екземпляри з нуля, а не копіювання існуючих. Для всебічного огляду обох варіантів, відвідування Рефакторинг сторінки метода Gru і Abstract Factory page.

Викрійці прототипу: Клон замість будівництва

Патерн прототипу створює нові об'єкти, скопіюючи існуючий об'єкт — прототип. Особливо цінний при миттєвості є дорогою (наприклад, важкі бази даних запитів, комплексні розрахунки геометрії) або коли об'єктна конфігурація трудомістка. Замість будівлі з нуля ви скинуєте попередньо налаштовану екземпляр і виверніть її як потрібно.

Клонування механіки: Шальворт проти глибокої копіювання

Більшість мов програмування пропонують вбудований метод клону (] в Java, в Python, або поширення в JavaScript). Однак уважно увагу необхідно приділити тому, чи є копія мілко (подрібнені посилання на мутальні предмети) або глибоко (повно самостійні). Глибока копія прямоочно дублює всі об'єкти, що додаються клоном. При реалізації прототипу необхідно визначити, який рівень копіювання підходить для вашого використання випадку.

class MazePrototype {
 public MazePrototype clone() throws CloneNotSupportedException {
 return (MazePrototype) super.clone(); // shallow copy
 }
}

Ідеальні сценарії для прототипу

  • Створення об'єкта: Наприклад, завантаження великої конфігурації з файлу або створення складної геометричної сітки.
  • Dynamic runtime об'єкти: Коли система повинна генерувати нові об'єкти, типи яких визначається в режимі runtime (наприклад, типи ворогів в грі, які спалюються з заздалегідь визначених шаблонів).
  • Редукція підкласних вибухів: Замість створення багатьох підкласів для легкої варіації, ви підігніть прототип і коригуйте кілька властивостей.

Реєстр та кешування прототипів

Ви можете прийняти прототип крок далі, використовуючи реєстри — центральний магазин попередньо створених прототипів, індексованих ключем. Клієнти вимагають прототипу за допомогою ключа, клонування його та налаштування. Ця комбінація прототипу з реєстром може служити легковагою альтернативи або заводу або однотону в певних випадках. Для детального проходу див. Рефакторинг гіру Прототип керівництво .

Побічні задніх сполук: однотон, завод, прототип

Щоб допомогти вам підібрати, таблиця нижче виділяється ключовими відмінностями:

PatternInstance CountCreation MechanismBest For
SingletonExactly oneSelf-managed global accessShared resources, global state
FactoryMultiple instances (or families)Centralized creation logicDecoupling client from concrete classes, complex creation
PrototypeMultiple instances cloned from a templateCloning (shallow/deep copy)Expensive instantiation, runtime object generation

Коли Візерунки перекриття або комбінезони

  • Singleton + Factory: Завод може бути одним з абстракційних заводів (наприклад, один абстрактний завод на платформі). Це поєднує глобальний доступ до централізованого створення.
  • Прототип + Фабрична фабрика: Рент-реліз може виступати як завод, замість того, щоб викликати конструктора. Це особливо корисно в розробці ігор, коли спонтанні суб'єкти.
  • Прототип + Singleton: Тип прототипу може бути однотонним у розумінні, що тільки один екземпляр прототипу існує за типом, хоча клони не є однотонними.

Практичне рішення

Якщо ви зіткнулися з проблемою дизайну, яка викликає для створення шаблону, запитайте ці питання, щоб зробити замовлення:

  1. Чи потрібен саме один екземпляр по всій програмі? Якщо так, розглянемо Singleton. Але будьте впевнені, що глобально поширений стан дійсно необхідний, і що тестування не буде страждати.
  2. Is створення об'єкта комплексно або ймовірно змінити?] Якщо так, використовуйте Фабричний метод або Абстрактний завод. Це особливо корисно, коли ви очікуєте додавання нових типів об'єктів пізніше.
  3. Іс створення продуктивності пляшкового вирізу, або я потребую багато екземплярів, які відрізняються тільки трохи? Якщо так, Прототип може заощадити час і пам'ять, склінінг шаблону.
  4. Чи більш ніж один візерунок слугує тим самим?] Evaluate Trade-offs. Наприклад, шаблон Легковаговик може зменшити пам'ять замість Prototype, якщо мета є обміном незмінними даними.

Приклади реального світу в інженерному програмному забезпеченні

Інженерні програми часто змішують ці візерунки. Система САД може використовувати одинок для менеджера налаштувань користувачів, завод для створення різних геометричних форм (коло, полігон, сплайн), і прототип для скринінгу складної збірки, а потім модифікації його. Симулятор може використовувати завод для створення різних об'єктів розчинника, прототипу копіювання параметрів системних конфігурацій, і однотон для служби зрубу, що записує всі імітаційні кроки.

Висновок: Не дозволяйте шаблонам собачать Ваш дизайн

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

За допомогою майстерування цих трьох шаблонів ви облаштували себе універсальним інструментом для побудови міцного, гнучкого інженерного програмного забезпечення. Для подальшого читання, вивчення Вікіпедія статті про шаблони програмного забезпечення та Рефакторинг Гуру огляд створення шаблонів.