[Factory Pattern] Esercizio

di il
6 risposte

[Factory Pattern] Esercizio

Devo discuterne le criticità e ristrutturare il codice utilizzando il pattern definito sopra.

public class Scrittore{
	public enum GenereLibro
	{
		AVVENTURA, GIALLO, FUMETTO;
	}

	public Libro pubblica(GenereLibro genere){
		Libro libro = null;
		swtch(genere)
		{
			case AVVENTURA: libro = new LibroAvventura(); break;
			case GIALLO: libro = new LibroGiallo(); break;
			case FUMETTO: libro = new Fumetto; break;
		}
		libro.impagina();
		
		return libro.
	}
}

public class ScrittoreDiGialli extends Scrittore{}

public class Fumettista extends Scrittore{}

abstract class Libro{
	void impagina();
}

public class LibroGiallo extends Libro{}

public class LibroAvventura extends Libro{}

public class Fumetto extends Libro{}

Qual'è una possibile criticità??

Ciao e buona giornata.

6 Risposte

  • Re: [Factory Pattern] Esercizio

    Penso delle possibili criticità potrebbero essere le seguenti:
    1- Una qualsiasi sottoclasse di Scrittore, potrebbe pubblicare un libro che non rientra nelle sue competenze;
    2- Nel caso in cui volessimo aggiungere nuovi generi di libri, ogni volta va modificata la classe Scrittore.

    Una possibile implementazione con il Factory potrebbe essere la seguente:

    === LIBRI FACTORY ===
    
    public class LibriFactory {
    
    	public static Libro getLibro(String genere){
    		Libro l = null;
    		
    		switch(genere){
    		
    		case "AVVENTURA": l=new Avventura(); break;
    		case "GIALLO" : l=new Giallo(); break;
    		case "FUMETTO" : l = new Fumetto(); break;
    		default: break;
    		}
    		return l;	
    	}
    }
    
    === LIBRO === (Giallo, Avventura e Fumetto estendono questa classe)
    
    public abstract class Libro {
    	void impagina(){};
    }
    
    === SCRITTORE ===
    
    public abstract class Scrittore {
    
    	protected Libro l;
    	
    	public Scrittore(){}
    	
    	protected Libro pubblica(){
    		
    		l.impagina();
    		
    		return l;	
    	}	
    }
    
    === FUMETTISTA === (Schema uguale anche per ScrittoreGialli, ScrittoreAvventure ecc... )
    
    public class Fumettista extends Scrittore{
    
    	public Fumettista(){
    		this.l = LibriFactory.getLibro("FUMETTO");
    	}
    	
    }

    Apprezzo qualsiasi tipo di consigli.
  • Re: [Factory Pattern] Esercizio

    Devi ammettere che sta cosa della criticità mi ha spiazzato.
    Però è più probabile che sia il punto 1 quello critico. Separare lo scrittore dal genere letterario permette una maggiore flessibilità.
    Il punto 2 è risibile: invece di aggiungere il codice nella classe scrittore, lo fai nella classe factory. Al netto del punto 1 i caratteri da digitare sono gli stessi.
  • Re: [Factory Pattern] Esercizio

    In che senso ti ha spiazzato??
    Credo sia più facile da sottoporre a manutenzione un progetto di grandi dimensioni che si presta al Factory.
  • Re: [Factory Pattern] Esercizio

    Comunque l'ho cambiato.

    === SCRITTORE (Creatore astratto) ===
    
    public abstract class Scrittore {
    
    	protected Libro l;
    
    	protected Libro pubblica(){
    		
    		 l = makeLibro();
    		 l.impagina();
    		 return l;	
    	}	
    	
    	abstract Libro makeLibro();   //demanda alle sottoclassi il compito di creare il giusto libro in base alle competenze dello scrittore
    
    }
    

    === Creatori Concreti (Fumettista, ScrittoreDiGialli ecc...) ===
    
    public class Fumettista extends Scrittore{
    
    	@Override
    	Libro makeLibro() {
    		return LibriFactory.getLibro("FUMETTO");
    	}	
    }
    

    === FACTORY DI LIBRI ===
    
    public class LibriFactory {
    
    	public static Libro getLibro(String genere){
    		Libro l = null;
    		
    		switch(genere){
    		
    		case "AVVENTURA": l=new Avventura(); break;
    		case "GIALLO" : l=new Giallo(); break;
    		case "FUMETTO" : l = new Fumetto(); break;
    		
    		default: break;
    	
    		}
    		return l;	
    	}
    }
    
  • Re: [Factory Pattern] Esercizio

    Nel senso che ormai mi viene spontaneo usare il factory, per cui a una domanda diretta faccio un pò fatica a rispondere. Per capirsi, io sarei partito direttamente col codice del secondo tuo post, invece che col primo.

    Si, infatti. Del resto i pattern nascono dalla pratica non dalla teoria. Quella è arrivata dopo.
  • Re: [Factory Pattern] Esercizio

    Penso che sia un modo di pensare nella modellazione OOP. Quindi se già hai acquisito quella forma mentis per strutturare un problema, è normale che ti venga spontaneo.
Devi accedere o registrarti per scrivere nel forum
6 risposte