Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-05-2010, 17:01   #1
e-commerce84
Senior Member
 
Iscritto dal: Feb 2009
Messaggi: 700
[Java Pattern Creator] Pattern Builder

Ciao,
faccio riferimento a queste slide: http://www.informatica.uniroma2.it/u...tern%20GOF.pdf

In particolare mi riferisco a pagina 23: Pattern Builder, mi potete dire se ho capito bene per favore?

Uso il pattern Builder quando ho un problema di costruzione complesso e voglio separare la logica algoritmica dalla costruzione dei singoli oggetti.

Nell'esempio ho le seguenti classi:

APPLICAZIONE PRINCIPALE:
Codice:
/* Applicazione principale */

public class MainApp {
	public static void main(){
		
		Director director = new Director();		// Costruzione dell'oggetto director
		Builder b1 = new ConcreteBuilder1();	// Costruzione del Builder Concreto di tipo 1
		Builder b2= new ConcreteBuilder2();		// Costruzione del Builder Concreto di tipo 2
		
		/* Creo il prodotto 1 di tipo 1: passa il builder di tipo effettivo ConcreteBuilder1 al metodo
		 * construct di director che invoca i metodi buildPartA e buildPartB del builder ti tipo 1 */
		director.construct(b1);
		
		Product p1 = b1.getResult();	// Mette il riferimento all'oggetto creato in p1
		p1.show();						// Mostra il contenuto della variabile di istanza di p1
		
		/* Creo il prodotto 2 di tipo 2: passa il builder di tipo effettivo ConcreteBuilder1 al metodo
		 * construct di director che invoca i metodi buildPartA e buildPartB del builder ti tipo 2 */
		director.construct(b2);
		
		Product p2 = b2.getResult();	// Mette il riferimento all'oggetto creato in p2
		p2.show();						// Mostra il contenuto della variabile di istanza di p1
		
	}

}
Classe Product:
Codice:
/* Definisce il tipo Product  che rappresenta un prodotto */

class Product {
	
	ArrayList parts = new ArrayList();	// che tipo è ArrayList...booo
	
	/* Interfaccia della classe */
	
	/* Aggiunge una stringa all'array */
	public void add(String part){
		parts.add(part);
	}
	
	/* Mostra il contenuto della variabile di istanza parts */
	public void show(){
		foreach(string part in parts)
			System.out.println(part);
	}
	
}
DIRECTOR:
Codice:
/* Classe Director */

class Director {
	
	/* Metodo che prende come parametro di input un oggetto builder concreto */
	public void construct(Builder builder){
		builder.buildPartA();  // Costruisce la parte A invocando il metodo del corretto builder concreto
		builder.buildPartB();  // Costruisce la parte B invocando il metodo del corretto builder concreto
	}

}
Classe astratta Builder ed implementazione dei Builder concreti:

Codice:
/* Builder astratto */

public abstract class Builder {
	public abstract void buildPartA();		// Costruisce la parta A
	public abstract void buildPartB();		// Costruisce la parta B
	public abstract Product getResult();		// Restituisce il Product risultante
}

/* Builder concreto 1 */

class ConcreteBuilder1 extends Builder { 
	
	private Product product = new Product();		// Crea una nuova istanza private di Product
	
	public void buildPartA(){	// Costruisce la parte A
		/* Mette la stringa "Part A" nella prima locazione dell'array parts relativo all'oggetto di
		 * istanza product */
		product.add("Part A");	
	}

	public void buildPartB(){	// Costruisce la parte B
		/* Mette la stringa "Part B" nella prima locazione dell'array parts relativo all'oggetto di
		 * istanza product */
		product.add("Part B");	
	}
	
	public Product getResult(){
		return product;				// Ritorna al chiamante l'oggetto così creato
	}
}

/* Builder concreto 2 */

class ConcreteBuilder2 extends Builder{ 
	
	private Product product = new Product();		// Crea una nuova istanza private di Product
	
	public void buildPartA(){	// Costruisce la parte A
		/* Mette la stringa "Part X" nella prima locazione dell'array parts relativo all'oggetto di
		 * istanza product */
		product.add("Part X");	
	}

	public void buildPartB(){	// Costruisce la parte B
		/* Mette la stringa "Part Y" nella prima locazione dell'array parts relativo all'oggetto di
		 * istanza product */
		product.add("Part Y");	
	}
	
	public Product getResult(){
		return product;				// Ritorna al chiamante l'oggetto così creato
	}
}
Io l'ho capito così (anche se mi sembra un bel po' macchinoso come pattern e stento a vederne una reale comodità...ma booo...forse mi sfugge qualcosa):

La classe Product mi rappresenta il mio prodotto che è formato di fatto da un array di stringhe chiamato parts. Tale classe permette di aggiungere una stringa all'array e di visualizzarne il contenuto

La classe astratta Builder rappresenta un generico oggetto costruttore ed ha 3 metodi abstract: buildPartA (che costruisce la parte A dell'oggetto finale), buildPartB (che costruisce la parte B dell'oggetto finale) e getResult() che ritorna il riferimento al prodotto costruito. Vabbè...poteva usare un'interface al posto della classe abstract mi sà...giusto?

Poi estendo tale classe con 2 sottoclassi ConcreteBuilder1 e ConcreteBuilder2 che di fatto implementano in modo diverso la costruzione di un oggetto Product (il primo builder costruisce l'oggetto inserento la stringa "Part A" nella prima locazione dell'array e "Part B" nella seconda. Mentre il secondo Builder ci mette dentro le stringhe "Part X" e "Part Y")

La classe Director serve a creare un oggetto director che conterrà la logica di costruzione del prodotto (cioè nella costruzione di un Productrima fai la parte A e poi fai la parte B).
Tale oggetto conterrà solo un metodo che prenderà come parametro di input il riferimento ad un builder concreto (che nel nostro caso sarà o ConcreteBuilder1 o ConcreteBuilder2).
In base al tipo effettivo del parametro richiamerà i corretti metodi buildPartA e buildPartB su tale parametro)

In pratica quindi succede ciò. Voglio creare un oggetto e posso crearlo in 2 modi differenti che chiamiamo MODO 1 e MODO 2 che creeranno 2 diversi tipi di prodotto PRODOTTO 1 e PRODOTTO 2.

Nell'applicazione principale (classe [MainApp]) per prima cosa creo un oggetto director che appunto contiene la logica di creazione (prima parte A e poi parte B).

Poi creo due builder concreti b1 e b2 di tipo rispettivamenteConcreteBuilder1 e ConcreteBuilder2.

Ora voglio creare un particolare prodotto col MODO 1, come faccio?

beh ho già creato il director, ho già creato il builder concreto di tipo 1, quindi alla riga:
[code]director.construct(b1);[/b1] invoco il metoto construct dell'oggetto director passandogli come parametro il builder concreto di tipo 1, questo a sua volta invocherà i metodi concreti buildPartA e buildPartB relativi proprio alla classe con il tipo concreto del builder (quindi i metodi implementati in ConcreteBuilder1), quest'ultimo costruisce l'oggetto richiesto.

e poi con la riga:
Codice:
Product p2 = b2.getResult();
metto il riferimento dell'oggetto appena costruito nella variabile p2.

mmm...è così che funziona? cmq mi pare parecchio cervellotica la cosa...in quali casi può tornare utile?

Grazie
e-commerce84 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Per non incorrere in nuovi aumenti delle...
Cubi Z AI 8M visto da vicino, un mini-PC...
Datacenter nello Spazio, affascinante ma...
Social e minori, Butti apre al dibattito...
Tutte le offerte Amazon del weekend, sol...
Amazon spinge sull'usato garantito: 10% ...
TikTok rischia una maxi-multa in Europa:...
Bose su Amazon: QuietComfort SC over ear...
Scope elettriche super accessoriate in o...
Umidità e muffa addio: questo deu...
DREAME Aqua10 Ultra Roller a 999€ &egrav...
500.000 kit gratis consegnati: Noctua fa...
Il MIT sperimenta il calcolo termico: op...
Sembra ormai certo: la prossima Xbox sar...
"Solutions Beyond Displays": l...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:29.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v