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);
...
}
}
scibi92