Porypana fabryka

0

Fabryka ma tworzyć obiekty dziedziczące po MyProcessor. Dostaje ona argumenty Object* przez wstrzykiwanie i tylko tak może je dostać. Problem polega na tym, że obiekty utworzone przez fabrykę (czyli MyProcessor) poza tymi polami Object* co fabryka ma wstrzyknięte potrzebuje obowiązkowo jeszcze 1 notNullField oraz kilka opcjonalnych canBeNull*. Tych pól z serii notNullField oraz canBeNull* nie da się wstrzyknąć.
Podsumowując obiekt tworzony przez fabrykę potrzebuje argumenty i wstrzyknięte i klasycznie zapodane.
Jak to ładnie napisać? Spójrzcie na kod:

class MyProcessor {

    Object o1;
    Object o2;
    ...
    Object notNullField;
    Object canBeNull1;
    Object canBeNull2;
    Object canBeNull3;
    ...
    
    MyProcessor(Object o1, Object o2, ...) {
        ...
    }
}
@Component
class MyFactory {

    Map<ProcessorType, MyProcessor> map = new HashMap<>();

    @Inject
    MyFactory(Object1 o1, Object2 o2, ...) {
        this.map.add(new MyProcessorImpl1(o1, o2,...));
        this.map.add(new MyProcessorImpl2(o1, o2, ...));
        ...
    }

    MyProcessor create(ProcessorType processorType) {
        return map.get(processorType);
    }
}

Propozycja 1:

class Client {
    @Inject
    void process(MyFactory myFactory, ...) {
        ...
        MyProcessor myProcessor = myFactory.create(processorType);
        myProcessor.setNotNullField(...)
            .setCanBeNull1(...)
            .setCanBeNull2(...)
            .setCanBeNull3(...)
            ...
        ...
    }
}

Propozycja 2:

class Client {
    @Inject
    void process(MyFactory myFactory, ...) {
        ...
        myFactory..setNotNullField(...)
            .setCanBeNull1(...)
            .setCanBeNull2(...)
            .setCanBeNull3(...)
            ...
        MyProcessor myProcessor = myFactory.create(processorType);
        
        ...
    }
}

Propozycja 3:

class Client {
    @Inject
    void process(InjectedFieldsForMyFactory fields, ...) {
        ...
        MyFactory myFactory = new MyFactory(fields, notNullField, canBeNullField1, canBeNullField2, canBeNyllField3, ...);
        MyProcessor myProcessor = myFactory.create(processorType);
        ...
    }
}
0

Te pola należą do obiektów konkretnie, czy do całych klas? Bo jeśli do obiektów, to opcja 1 ale nie taka zjebana tylko z fluent builderem. Niech to factory zwraca buildera który już ma tam poustawiane te wstrzykiwane rzeczy, a user sobie dokonfiguruje.

0

Jestes uposledzony? Musialbym dla kazdej klasy dziedziczacej po MyObject dorobic takiego fluent buildera.

1

O jejku, dwa kliki w intelij xD tam gdzie robisz generate setters można sobie wybrać że chcesz buildera...
Lombok czy Immutables też umieją.

1 użytkowników online, w tym zalogowanych: 0, gości: 1