Я читав різні думки щодо однотонної картини. Одні стверджують, що його слід уникати будь-якою ціною, а інші, що може бути корисним у певних ситуаціях.
Одна ситуація, в якій я використовую одиночні кнопки - це коли мені потрібна фабрика (скажімо, об'єкт f типу F) для створення об'єктів певного класу A. Фабрика створюється один раз за допомогою деяких параметрів конфігурації, а потім використовується кожен раз, коли об'єкт тип А є інстанційним. Отже, кожна частина коду, яка хоче інстанціювати A, отримує сингл f та створює новий екземпляр, наприклад
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
Тож загальний мій сценарій такий
- Мені потрібен лише один екземпляр класу або з міркувань оптимізації (мені не потрібно декількох заводських об'єктів), або для спільного використання загального стану (наприклад, фабрика знає, скільки екземплярів A він ще може створити)
- Мені потрібен спосіб отримати доступ до цього примірника F у різних місцях коду.
Мене не цікавить обговорення, чи добре це, чи погано, але припускаючи, що я хочу уникати використання синглтона, який ще візерунок я можу використовувати?
У мене були ідеї (1) отримати заводський об'єкт з реєстру або (2) створити завод у якийсь момент під час запуску програми, а потім передати завод як параметр.
У рішенні (1) сам реєстр є однотонним, тому я щойно переклав проблему не використовувати синглтон з фабрики до реєстру.
У випадку (2) мені потрібне початкове джерело (об’єкт), з якого походить заводський об’єкт, тому я боюся, що я знову повернусь до іншого сингтона (об’єкта, який надає мій заводський екземпляр). Дотримуючись цю ланцюжку синглів, я можу, можливо, звести проблему до одного сингтона (всієї програми), за допомогою якого всі інші сингтони безпосередньо чи опосередковано управляються.
Чи був би останній варіант (використання одного початкового сингтона, який створює всі інші унікальні об'єкти та вводить усі інші сингтони в потрібні місця)? Це рішення, яке явно пропонується, коли не рекомендується використовувати одиночні кнопки, або які інші рішення, наприклад у прикладі, проілюстрованому вище?
EDIT
Оскільки я думаю, що питання мого питання дехто неправильно зрозумів, ось додаткова інформація. Як пояснено, наприклад, тут слово singleton може вказувати (a) клас з об'єктом одного примірника та (b) шаблон дизайну, який використовується для створення та доступу до такого об'єкта.
Щоб зробити речі зрозумілішими, скористаємося терміном унікальний об'єкт для (a) та однотонним шаблоном для (b). Отож, я знаю, що таке одинарна картина та ін'єкція залежності (BTW, останнім часом я активно використовую DI, щоб видалити екземпляри однотонної картини з якогось коду, над яким я працюю).
Моя думка полягає в тому, що, якщо весь графік об'єкта не буде ініційований з одного об'єкта, що живе в стеці основного методу, завжди буде необхідність доступу до деяких унікальних об'єктів за допомогою однотонного шаблону.
Моє запитання полягає в тому, чи залежить створення повного об'єктного графіка та проводка від основного методу (наприклад, через деяку потужну рамку DI, яка не використовує сам шаблон) - єдине безкоштовне рішення, що має єдиний шаблон .