powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / абстрактная фабрика - концептуальный вопрос
31 сообщений из 31, показаны все 2 страниц
абстрактная фабрика - концептуальный вопрос
    #38549015
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Есть сервис принимающий на вход события разных типов.
Для каждого типа события есть фабрика с помощью которой порождаются специфичные для этого типа события объекты.
Пока все норм, но есть нюанс - может ли объект порожденный фабрикой содержать в себе ссылку на родительскую фабрику (для получения других объектов из фабрики), к чему это может привести?
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549053
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJack,

А почему она не static final?
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549062
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackможет ли объект порожденный фабрикой содержать в себе ссылку на родительскую фабрику
Может
eJackк чему это может привести?
К чему угодно. Например к сильной связности.
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549075
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ссылка - интерфейс, то всё ок.
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549105
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛагманЕсли ссылка - интерфейс, то всё ок.
осталось рассмотреть всё многообразие ситуаций))
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549106
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123осталось рассмотреть всё многообразие ситуаций))
В точку.
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549262
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro123осталось рассмотреть всё многообразие ситуаций))
В точку.

вот все именно так!
это и пугает - где то косячу в архитектуре
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549269
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackвот все именно так!
это и пугает - где то косячу в архитектуре
На "концептуальный" вопрос можно дать только "концептуальный" ответ. А если взять конкретный случай, то всё может отказаться совершенно иначе.
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549288
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackможет ли объект порожденный фабрикой содержать в себе ссылку на родительскую фабрику
может ли элемент дерева - Node содержать в себе указатель на родителя?
- может.
может ли Кнопка иметь ссылку на родителя - Форму где лежит?
и т.д.
Короче, это пуповина ))) LOL
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549360
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczeJackвот все именно так!
это и пугает - где то косячу в архитектуре
На "концептуальный" вопрос можно дать только "концептуальный" ответ. А если взять конкретный случай, то всё может отказаться совершенно иначе.

Ок.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public abstract class EventFactory {
    public static EventFactory getFactory(String eventType) {
        ......
    }

    public abstract Executor getExecutor();

    public abstract Mapper getMapper();
.......
}



собственно для всех типов событий наследуются все типы и переопределяются методы в них.
так вот приходит событие:
Получаем фабрику методом EventFactory.getFactory(...)

Получаем наследника Executor через getExecutor()

И добавляем его в ExecutorService

далее когда начинается выполнятся executer - внутри него создаются объекты Mapper и т.д. которые есть в фабрике.
собственно Executer содержит ссылку на породившую его фабрику.
Код: java
1.
2.
3.
4.
public interface BaseExecutor extends Executor {
    EventFactory getParentFactory();
    
}
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549424
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
многабукаффeJackBlazkowiczпропущено...

На "концептуальный" вопрос можно дать только "концептуальный" ответ. А если взять конкретный случай, то всё может отказаться совершенно иначе.


Ок.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public abstract class EventFactory {
    public static EventFactory getFactory(String eventType) {
        ......
    }

    public abstract Executor getExecutor();

    public abstract Mapper getMapper();
.......
}



собственно для всех типов событий наследуются все типы и переопределяются методы в них.
так вот приходит событие:
Получаем фабрику методом EventFactory.getFactory(...)

Получаем наследника Executor через getExecutor()

И добавляем его в ExecutorService

далее когда начинается выполнятся executer - внутри него создаются объекты Mapper и т.д. которые есть в фабрике.
собственно Executer содержит ссылку на породившую его фабрику.
Код: java
1.
2.
3.
4.
public interface BaseExecutor extends Executor {
    EventFactory getParentFactory();
    
}





Ну, и что мешает в BaseExecutor добавить метод setParentFactory(EventFactory factory) ?
А перед выдачей Executor сделать присвоение...
Правда придётся немного переделать реализацию метода getExecutor().
Например вот так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
    public Executor getExecutor(){
       Executor executor = internalGetExecutor();
       executor.setParentFactory(this);
       return executor();
    }

    protected abstract Executor internalGetExecutor();
...

Соответственно конкретная фабрика должна будет реализовать не getExecutor(), а internalGetExecutor().
Но здесь есть и обратная сторона медали - Executor будет жестко завязан с фабрикой...
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549517
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov,

Вы наверное не внимательно читали (или я не понятно описал), но суть вопроса не как реализовать ссылку на родительскую фабрику, меня интересует опыт такой реализации, какие потом были проблемы, плюсы и минусы.
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549538
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackплюсы и минусы.
Минус - лишняя ссылка в памяти. :)
Минус - фабрика будет жить в памяти пока жив хоть один потомок. :)

Плюс - можно узнать какая фабрика создала объект, особенно если генератор ее синглтона сделан непотокобезапасным.

P.S. надеюсь сеарилизовать объект будете без фабрики?
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549614
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackAlex Kuznetsov,

Вы наверное не внимательно читали (или я не понятно описал), но суть вопроса не как реализовать ссылку на родительскую фабрику, меня интересует опыт такой реализации, какие потом были проблемы, плюсы и минусы.Вроде внимательно прочитал.
Посмотрим:
автор... может ли объект порожденный фабрикой содержать в себе ссылку на родительскую фабрику (для получения других объектов из фабрики), к чему это может привести?
Да, на эти вопросы были даны ответы.

Так что сорри, мой ответ про реализацию - пук в воду...
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549741
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев
P.S. надеюсь сеарилизовать объект будете без фабрики?


не планировал :)
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549752
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackСергей АрсеньевP.S. надеюсь сеарилизовать объект будете без фабрики?


не планировал :)
не планировал сеарилизовать фабрику :)
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549857
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJack,

А по-моему, "чистота шаблона" обеспечивается только тем, что каждый создаваемый Executor уже содержит в себе все необходимые свойства. Если хотите, чтобы "почти одинаковые" Executor отличались поведением в зависимости от породившей фабрики - разделяйте их на два (3, 5, 10) разных реализаций Executor и в них уже реализуйте все отличия, чтобы не морочить потом людям голову необходимостью использовать что-то кроеме execute().
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549941
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJack,
кажется, я догадался о вашей "сверхзадаче" - создавать "один и тот же объект" разными фабриками (интересно, как это вообще может вписаться в этот шаблон?) - и впоследствии нарушить 1-е правило что не должно быть зависомости от того, как создаются объекты. Те, кто потом наткнутся на этот ваш "шаблон" придут в большое недоумение.
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38549968
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинкасоздавать "один и тот же объект" разными фабрикам
imho наоборот.
Фабрика создала "Самолёт".
Самолёт из фабрики сам создал "Правое крыло".
Т.е. как будто фабрика глобальный синглетон или инжектится
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38550099
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Извиняюсь, я не готов к такой дискуссии - про крылья ( к тому же даже не указано, о какой "фабрике" идет речь)
Но в любом случае, если работа идет на уровне интерфейсов, то не стоить вносить зависимость в объекты (одного типа) запоминая их историю создания, это как раз спагетти и получится.
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38550130
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинкане стоить вносить зависимость в объекты (одного типа) запоминая их историю создания
я не увидел ничего криминального в "ссылках на родителя. Фабрика это или ещё что".
А додумывать за автора смысла нет. Он весь код-ТЗ не привёл.
Удачи!
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38550264
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да все просто - есть событие Event.
События различаются по типу - EventType (String).
Так же каждое событие содержит специфичные для этого типа данные.
Каждый тип события имеет свой специфический путь (шаблон) обработки.
Каждый тип события обрабатывается с определенным приоритетом.

Это было общее (приближенное к реальному) ТЗ.


Далее
Получаем событие.

По типу получаем фабрику.

Из фабрики получаем Executor и кладем его в в очередь на обработку (тут на самом деле все немного сложнее, но это не меняет сути).

Когда очередь доходит до Execotor (начинается выполнение), он обращается к родительской фабрики (через ссылку) и создает необходимые для этого типа события объекты. Например парсер (для получения данных события), мапперы, трансформаторы, шаблон обработки (шаблонный метод). Все это через родительскую фабрику.

ПылинкаeJack,

А по-моему, "чистота шаблона" обеспечивается только тем, что каждый создаваемый Executor уже содержит в себе все необходимые свойства. Если хотите, чтобы "почти одинаковые" Executor отличались поведением в зависимости от породившей фабрики - разделяйте их на два (3, 5, 10) разных реализаций Executor и в них уже реализуйте все отличия, чтобы не морочить потом людям голову необходимостью использовать что-то кроеме execute() .


"Чистота шалбона" не цель. Фактически вы предлагаете перенести функции фабрики в Executor (если я правильно уловил мысль), думал об этом, но как по мне сути это не поменяет - хотя может и будет более логичным (но тоже спорно).
Про морочить голову не понял мысли ? Поясните - что сейчас не так?

ПылинкаeJack,
кажется, я догадался о вашей "сверхзадаче" - создавать "один и тот же объект" разными фабриками (интересно, как это вообще может вписаться в этот шаблон?) - и впоследствии нарушить 1-е правило что не должно быть зависомости от того, как создаются объекты. Те, кто потом наткнутся на этот ваш "шаблон" придут в большое недоумение.


не понял откуда такое умозаключение? шаблон абстрактная фабрика - где и что я нарушил?
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38553040
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackДа все просто - есть событие Event.
События различаются по типу - EventType (String).
Так же каждое событие содержит специфичные для этого типа данные.
Каждый тип события имеет свой специфический путь (шаблон) обработки.
Каждый тип события обрабатывается с определенным приоритетом.
В таком случае, я недоумеваю - зачем хранить ссылку, когда фабрику можно снова получить в любой нужный момент, точно так же, обычным путем?
PS Я ничего вообще не предлагал, это ваше решение как раз превращает Executor в фабрику, я лишь попытался наййти этому какое-то разумное объяснение.
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38553306
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаeJackДа все просто - есть событие Event.
События различаются по типу - EventType (String).
Так же каждое событие содержит специфичные для этого типа данные.
Каждый тип события имеет свой специфический путь (шаблон) обработки.
Каждый тип события обрабатывается с определенным приоритетом.
В таком случае, я недоумеваю - зачем хранить ссылку, когда фабрику можно снова получить в любой нужный момент, точно так же, обычным путем?
PS Я ничего вообще не предлагал, это ваше решение как раз превращает Executor в фабрику, я лишь попытался наййти этому какое-то разумное объяснение.

Тривиально не получите - так как для получения фабрики используется название типа события, но оно не прокидывается в Executor.
Да и тогда получается что давайте все свяжем "сильными" ссылками ну их эти паттерны.
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38553392
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJack,
не понял, почему не одна фабрика на все события. Событие - это тоже метатип объекта.
eJackтак как для получения фабрики используется название типа события
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38554292
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123eJack,
не понял, почему не одна фабрика на все события. Событие - это тоже метатип объекта.
eJackтак как для получения фабрики используется название типа события

Мы точно все говорим об одно и том же?
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38554350
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJack,
перепишу свой посыл:
- я не понял, почему нельзя так:
Код: java
1.
2.
3.
4.
ОднаФабрика.СоздатьОбъект('МышкаПереместить', Param)
ОднаФабрика.СоздатьОбъект('МышкаНажать', Param)
ОднаФабрика.СоздатьОбъект('НепонятноКакоеСобытие', Param)
....
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38554368
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123eJack,
перепишу свой посыл:
- я не понял, почему нельзя так:
Код: java
1.
2.
3.
4.
ОднаФабрика.СоздатьОбъект('МышкаПереместить', Param)
ОднаФабрика.СоздатьОбъект('МышкаНажать', Param)
ОднаФабрика.СоздатьОбъект('НепонятноКакоеСобытие', Param)
....



абстрактная фабрика создает семейство объектов - это суть паттерна.
У меня у интерфейса (абстрактный класс) более 10 методов get/create - которые создают разные объекты для конкретного типа события.
Вот то что я уже писал, еще раз
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public abstract class EventFactory {
    public static EventFactory getFactory(String eventType) {
        ......
    }

    public abstract Executor getExecutor();

    public abstract Mapper getMapper();
.......
}



Далее - для каждого типа события создается наследник этого класса.

Решаемая задача - что из фабрики я получаю объекты именно для конкретного типа сообщения - это и различные DAO, мапперы, конвертеры и т.д.

Вы же предлагаете мне написать один мега класс типа:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public abstract class EventFactory {
    public static EventFactory getFactory(String eventType) {
        ......
    }

    public abstract Executor getEventType1Executor();

    public abstract Mapper getEventType1Mapper();
.......
    public abstract Executor getEventType2Executor();

    public abstract Mapper getEventType2Mapper();
........
    public abstract Executor getEventType3Executor();

    public abstract Mapper getEventType3Mapper();

}



но, это не абстрактная фабрика !
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38554410
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJackабстрактная фабрика создает семейство объектов - это суть паттерна.
разумеется.
Просто, если идти не от задачи (функции main), то сложно понять что именно нужно.
Суть паттерна в группах, группах в группе и ещё раз в группах
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public static void main(final String[] args) {
        // .....
        final AllFactory factoryAll;
        switch (EventType) {
            case 1:
                factoryAll = new MouseFactory(Param);// создали 1 группу
                break;
            case 2:
                factoryAll = new KeyFactory(Param);
                break;
            default:
                throw new IllegalStateException();
        }
 
        final EventProcessor eventProcessor = new EventProcessor(factoryAll);// создали 2 группу
        eventProcessor.RunEvent(Paramn2);
    }


// Client
public class EventProcessor {  
    private MoveProcessor moveProcessor;
    private DownProcessor downProcessor;
 
    public EventProcessor(..... factoryAll) {
        moveProcessor = factoryAll.createMoveProcessor();
        downProcessor = factoryAll.createDownProcessor();	
    }
    public void RunEvent (Param2) {
        // ....
        moveProcessor.RunMove(Param2);
        downProcessor.RunDown(Param2);
        // ....
    }
}


т.е. идём от задачи и функции main
Так?
...
а сама абстрактная фабрика только для того, чтобы всё многообразие объектов передать через одно "игольное ушко"
EventProcessor(factoryAll)
если это не надо, то шаблон не нужен. Пример чего я и приводил выше.
IMHO
______________________________________________
"Сложнее всего в мире достигнуть простоты — это крайняя граница опыта и последнее усилие гения". © George Sand.
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38558114
eJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123eJackабстрактная фабрика создает семейство объектов - это суть паттерна.
разумеется.
Просто, если идти не от задачи (функции main), то сложно понять что именно нужно.
Суть паттерна в группах, группах в группе и ещё раз в группах
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public static void main(final String[] args) {
        // .....
        final AllFactory factoryAll;
        switch (EventType) {
            case 1:
                factoryAll = new MouseFactory(Param);// создали 1 группу
                break;
            case 2:
                factoryAll = new KeyFactory(Param);
                break;
            default:
                throw new IllegalStateException();
        }
 
        final EventProcessor eventProcessor = new EventProcessor(factoryAll);// создали 2 группу
        eventProcessor.RunEvent(Paramn2);
    }


// Client
public class EventProcessor {  
    private MoveProcessor moveProcessor;
    private DownProcessor downProcessor;
 
    public EventProcessor(..... factoryAll) {
        moveProcessor = factoryAll.createMoveProcessor();
        downProcessor = factoryAll.createDownProcessor();	
    }
    public void RunEvent (Param2) {
        // ....
        moveProcessor.RunMove(Param2);
        downProcessor.RunDown(Param2);
        // ....
    }
}


т.е. идём от задачи и функции main
Так?
...
а сама абстрактная фабрика только для того, чтобы всё многообразие объектов передать через одно "игольное ушко"
EventProcessor(factoryAll)
если это не надо, то шаблон не нужен. Пример чего я и приводил выше.
IMHO
______________________________________________
"Сложнее всего в мире достигнуть простоты — это крайняя граница опыта и последнее усилие гения". © George Sand.


Читайте внимательнее вопрос - суть =>
Код: java
1.
2.
3.
4.
//EventProcessor eventProcessor = new EventProcessor(factoryAll)

EventProcessor eventProcessor = factory.getEventProcessor(eventname);
factory.getExecuterService(eventname).add(eventProcessor);
...
Рейтинг: 0 / 0
абстрактная фабрика - концептуальный вопрос
    #38558151
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eJack,
если тебе лень писать словами, то "читай все ответы выше".
ЗЫ. процессоры не имеют отношения к фабрике и шаблону.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / абстрактная фабрика - концептуальный вопрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]