Sfondo
Ho una classe TextDrawable
che disegna il testo sopra una forma. Esistono numerose proprietà che possono essere impostate durante la creazione di un oggetto TextDrawable
.
Proprietà obbligatorie:
- testo
- Forma
Proprietà opzionali:
- Colore
- Larghezza
- Altezza
- Carattere
- Border
- ...
- ... ecc.
La classe avrà costruttori che assomigliano a:
public TextDrawable(String text, Shape shape) {
}
public TextDrawable(String text, Shape shape, int color) {
}
public TextDrawable(String text, Shape shape, int color, int width, int height) {
}
// and so on..
Modello generatore :
Ho deciso di utilizzare Builder Pattern
per rendere più conveniente la creazione di oggetti TextDrawable
. Ho seguito il design come spiegato in Java efficace e in questa risposta altamente pubblicizzata . Ho trovato la classe builder che verrà utilizzata come segue:
TextDrawable drawable = new TextDrawable.Builder("AK", Shape.RECT)
.width(10)
.height(10)
.useFont(Typeface.DEFAULT_BOLD)
.build();
Possibile problema :
Sembra che ci sia un problema con questo design. Poiché i campi "obbligatori" vengono passati in constructor
del builder, il builder non può essere riutilizzato.
Che cosa succede se volevo creare un altro TextDrawable
della stessa altezza, larghezza, carattere ecc. ma con% diverso% di% e% di% di co_de. Dovrò creare un altro oggetto costruttore e ripetere lo stesso codice come sopra.
TextDrawable oct = new TextDrawable.Builder("OCT", Shape.RECT)
.width(10)
.height(10)
.useFont(Typeface.DEFAULT_BOLD)
.build();
TextDrawable nov = new TextDrawable.Builder("NOV", Shape.OVAL)
.width(10)
.height(10)
.useFont(Typeface.DEFAULT_BOLD)
.build();
Metodo proposto :
Cosa succede se sposto text
dal costruttore del builder al metodo build come segue:
TextDrawable drawable = new TextDrawable.Builder()
.width(10)
.height(10)
.useFont(Typeface.DEFAULT_BOLD)
.build("AK", Shape.RECT);
In questo modo è più flessibile in quanto posso creare un'istanza del builder e riutilizzarla per creare più oggetti. (Evita anche di ripetere lo stesso codice ogni volta che creo un nuovo oggetto.) Il nuovo utilizzo sarà simile a:
TextDrawable.Builder builder = new TextDrawable.Builder()
.width(10)
.height(10)
.useFont(Typeface.DEFAULT_BOLD);
TextDrawable oct = builder.build("OCT", Shape.RECT);
TextDrawable nov = builder.build("NOV", Shape.OVAL);
Impedisce il codice boilerplate. Permette anche al metodo di costruzione di adattarsi all'idioma fluente come segue:
TextDrawable oct = builder.buildRect("OCT");
TextDrawable nov = builder.buildOval("NOV");
Domande :
-
Il problema identificato sopra è valido o mi manca la comprensione del
color
? Non dovremmo riutilizzaremandatory parameters
oggetti per creare istanze multiple? -
La modifica proposta al ben noto
builder pattern
è valida? Ci sono degli svantaggi nello spostare i "campi obbligatori" nel metodobuilder
? -
Se ci sono alcuni possibili inconvenienti, qual è il modo migliore per ottenere ciò che voglio? Dovrei usare un oggetto
builder pattern
o qualcosa che incapsula ilbuild()
per ottenere quello che voglio?