Тут 2 паттерна синглтон и фабрика. И никакая не абстрактная, а самая обычная. Основная суть легковеса(хз, откуда приспособленец вылез), экономить память за счет хранения обших для обьектов ресурсов. А тут просто обьекты не создаются, если уже созданы. Как-бы разные вещи. Убрать отсюда фабрику и будет типичный снглтон. Убрать синглтон и будет просто фабрика. Суть паттерна не раскрыта. А вот в примерах которые вы разбираете дальше, как раз есть корректный пример.
ты в примере создаёшь 3 круга с радиусов = 5, объект создаётся только для первого круга, и в 2-х следующих операциях он переиспользуется - это понятно. А что если нам необходим круг с любым другим радиусом ? Круг с радиусом 6, создаст новый объект ?
Нет, создание такового невозможно в рамках этого кода и паттерна в принципе. По ключу "круг" map имеет 1 объект-экземпляр с радиусом 5. В List добавляются 3 ссылки на этот экземпляр. Если использовать get метод, то вернётся старый добрый круг с радиусом 5. Для изменения этого значения его необходимо вывести как внешнее значение, а не внутреннее. Либо оформить новый , отдельный от этого класс. Вариант с установкой радиуса как отдельного метода не подходит под этот паттерн, так как тут либо разделяй на внешнее(контроль радиуса будет через параметр в draw) и внутреннее состояние , либо не используй этот паттерн вовсе. Если же тебе всё же необходимо изменять с каждой надобностью объекта класса "круг" его внутреннее значение, то посмотри другие паттерны. Его применяемость на практике довольно таки мала, он очень радко где используется.
я что-то не понимаю, или как в shapes(final Map) запихиваются фигуры? там же константа должна быть, при попытке изменить final объект дожна быть ошибка, а мы тут как раз вставляем фигуры
В данном случае shapes это сслыка на объект типа MAP который хранится в пямяти. И final говорит, что мы не можем shapes`ам присвоить новую ссылку(тоесть заменить объект сделав new HashMap()). Но нам ни кто не мешает изменять состояние данного объекта. А в качестве состояния у него выступает "грубо говоря!" массив в который мы можем ложить обекты flyweight в любом количестве.
В реальных ситуациях почти всегда используются комбинации шаблонов, это норма, лишь бы код был эффективным, удобным и легкочитаемым. Пардон за некропостинг, если что...
эээ, ты вообще в курсе, что в map не могут храниться 2 одинаковых ключа? ))) то есть не надо проверять, есть ли он там уже ))) а надо переопределить equals и hashmap ))) и он автоматически не будет туда попадать ) паттерны ты знаешь, но вот коллекции - это ппц ))) Т.е просто создаешь фигуру и пытаешься ее запихать в map, она туда не полезет, если уже там есть. А чтобы не создавались много однотипных фигур, юзай синглтон
Проверка на наличие сделана для того, что бы не перезаписать существующий(если он там окажется). Если он там уже есть, то значит нужно его просто получить(не резервируя на точно такой же объект память) для каких то вызовов. В данном случае экземпляр круга в List только 1, а объектов 3. Но пагубным является то, что при изменении какого либо из 3 "кругов", значение поменяют и остальные. Всё равно синглтоны необходимо будет хранить где то, здесь это удобнее + синглтон можно сериализовать а затем десериализовать и получить 2 синглтон(речь о стандартной его реализации) , так как синглтон своё создание контролирует сам, а здесь эту роль принимает Фабрика. Проблематика этого паттерна немного в другом. Он помогает использовать уже созданное, под разные задачи а не резервировать память заново. Например что бы написать слово в комментарий, я использую буквы(объекты в map) из алфавита(сам map, из примера).