Perché utilizzare i modelli di creazione (in Java)?
Il motivo principale per i pattern creativi è separare la creazione di un'istanza dal suo consumo .
Questo sembra in primo luogo piuttosto astratto, ma è facile vedere le conseguenze.
1) Si nasconde la logica creazionale dal consument di una istanza di oggetto . Come consument non ti interessa come viene creata un'istanza . Hai solo una domanda concreta (servizio, deposito, ecc.). Ogni richiesta è una dipendenza del tuo oggetto. Che porta a
2) È possibile inserire dipendenze dall'esterno, ovvero injection injection .
Se sei in grado di iniettare / sostituire le dipendenze di un oggetto, puoi scrivere unit-test . Supponiamo che tu abbia bisogno del risultato di una complessa query DB o il risultato di diverse chiamate al servizio web; potresti facilmente iniettare quei risultati dai risultati esterni o stub .
Inoltre puoi simulare / bloccare gli oggetti creativi stessi, che potrebbero essere usati per fornire altri mock / stub.
Un codice migliore / più verificabile porta a una copertura del codice più elevata, che porta nel migliore dei casi a una migliore e più elevata qualità del codice.
Potresti fare l'iniezione di dipendenza a mano o usare un qualche tipo di automazione, ad es. Spring-framework o simili.
Quali conseguenze negative potrebbero essere affrontate non utilizzando gli schemi creativi?
Lo svantaggio di non utilizzare pattern creativi dovrebbe essere chiaro da quanto detto sopra: rende più difficile il tuo codice a capire e test .
esempi di codice reali:
Supponiamo che tu abbia una macchina, che a sua volta ha un motore. Un modo tipico per impiantarlo è questo
public class Car {
Engine engine;
public void start(){
engine.start();
}
public void stop(){
engine.stop();
}
public Car(){
engine=new Engine();
}
}
public class Engine {
public void start(){
}
public void stop(){
}
}
Hai una macchina, che istanzia il suo motore. Tramite l'interfaccia della macchina, puoi avviare / fermare la macchina / il motore.
Questo non va bene in molti modi:
1) non si è in grado di cambiare il motore, l'auto funziona con. Potrebbe non sembrare un problema, dal momento che si intendeva che la macchina funzionasse solo con il motore specificato
2) ma, non potevi scambiare il motore reale per un testengine .
Devi prendere due passaggi per migliorare il design:
1) separa il consumo del motore dal suo uso
2) usa un pattern factory per incapsulare la creazione del motore
L'auto migliorata:
public class Car {
Engine engine;
public void start(){
engine.start();
}
public void stop(){
engine.stop();
}
public Car(Engine engine){
this.engine=engine;
}
}
I vantaggi sono:
- possibilità di scambiare il motore per l'auto
- possibilità di scambiare la fabbrica per il motore
Quindi l'intera creazione dell'automobile potrebbe essere sottratta con un builder :
public class CarBuilder {
EngineFactory engineFactory;
public Car build(){
return new Car(engineFactory.produceEngine());
}
public CarBuilder(EngineFactory engineFactory){
this.engineFactory=engineFactory;
}
}
Quale potrebbe essere deriso / soppresso.