MarcoRayRaimondi ha scritto:
Un Builder è ad esempio:
public class Libro{
Srting titolo,codiceIbs,autore;
double prezzo;
public static Libro Builder(){
private static String titolo;
private static String codiceIbs;
private static String autore;
private static double prezzo;
public static Build(){
Libro libro=new Libro();
libro.titolo=titolo;
libro.codiceIbs=codiceIbs;
libro.autore=autore;
libro.prezzo=prezzo;
return libro;
}
public Builder(String codiceIbs){
Builder.codiceIbs=codiceIbs;
}
public Builder titolo(String titolo){
this.titolo=titolo;
return this;
}
...
...
A parte il fatto che questo che hai scritto è sbagliato sintatticamente (e anche concettualmente) e non ti compila proprio. Ma questo comunque NON è il pattern Builder!! È una
variante semplificata del pattern Builder che si usa sovente specialmente quando ci sono classi "immutabili" che hanno tanti attributi opzionali.
Questa è la tipica tecnica di mettere una
nested class (chiamata solitamente solo Builder) con i metodi che ritornano il builder stesso per sfruttare il
method chaining e rendere la costruzione più "fluente" ma come ripeto, non è il pattern Builder come descritto nei libri sui Design Pattern. Perché astrazione/ereditarietà qui sostanzialmente non ci sono.
MarcoRayRaimondi ha scritto:
Se volessi implementare una maniera di costruire un costruttore che si "adatti" a qualsia oggetto?
public interface Builder{
public void BuildPart1();
public void BuildPart2();
public void BuildPart3();
public void Build();//?????
}
Quello che forse non ti è ancora chiaro è che un "builder" è strettamente legato ad un certo tipo di oggetto che costruisce. Se hai una classe Pizza (magari complessa e/o immutabile) allora puoi fare un PizzaBuilder che avrà metodi es. addPomodoro(), addFormaggio() ecc... e con un build() che restituisce Pizza.
Nella tua interfaccia hai un Builder (di che?) con metodi buildPart1(), buildPart2() (che fanno che??) e un build() (che restituisce che???)
Non ha molto senso ..... un builder deve essere più "contestualizzato".
Volendo astrarre il più possibile sfruttando anche i generics, la astrazione più "alta" potrebbe essere
public interface Builder<T> {
T build();
}
Sì, solo tutto qui ma perché a questo livello di astrazione si sa nulla, solo che il builder ha un build() che dà un certo oggetto.
Poi lo si potrebbe estendere e specializzare, andando a contestualizzare meglio e fissando anche la parametrizzazione.
public interface PizzaBuilder extends Builder<Pizza> {
void addPomodoro();
void addFormaggio();
//....
}
E poi ci possono essere varie implementazioni concrete che variano appunto nel modo di costruire l'oggetto e/o nei dati utilizzati, es. in un PizzaNapoliBuilder il addPomodoro() potrebbe aggiungere un certo tipo di pomodoro mentre un PizzaNewYorkBuilder potrebbe fare diversamente.
La mia conclusione è che forse non hai ancora compreso bene il pattern Builder .... o forse stai cercando di usarlo in un contesto dove invece sarebbe più utile un altro pattern "creazionale" ....