2011-09-21 9 views

risposta

6

Secondo GoF, l'intento del modello Abstract Factory è quello di fornire un'interfaccia per la creazione famiglie di oggetti correlati o dipendenti senza specificare le loro classi conrcete.

In quadri le fabbriche astratte sono in genere fornite utilizzando l'iniezione di dipendenza e questa è la vera chiave per scrivere codice che è facile da testare. Iniezione di dipendenza significa semplicemente che le dipendenze sono "iniettate" attraverso il costruttore, piuttosto che introdotte all'interno della classe.

Supponiamo di utilizzare due stabilimenti per la produzione di dipendenze (qui solo una dipendenza, dadi) per i giochi facili e duri di backgammon:

public class EasyGameFactory implements GameFactory 
{ 
    Dice createDice() 
    { 
    return new LuckyDice(); 
    } 
} 

public class NormalGameFactory implements GameFactory 
{ 
    Dice createDice() 
    { 
    return new RandomDice(); 
    } 
} 

A scopo di verifica unità che si sarebbe davvero preferisce utilizzare nessuna delle implementazioni dei dadi , quindi si scrive una speciale implementazione GameFactory:

public class CustomGameFactory implements GameFactory 
{ 
    private Dice mDice; 

    public CustomGameFactory(Dice dice) 
    { 
    mDice = dice; 
    } 

    Dice createDice() 
    { 
    return mDice; 
    } 
} 

Questa fabbrica non dovrebbe essere parte del vostro albero di codice di produzione. Si fornisce la fabbrica con una speciale implementazione dei dadi attraverso il codice di prova:

public class TestBackgammon 
{ 
    @Test public void shouldReturnDiceThrown() 
    { 
    SettableDice dice = new SettableDice(); 
    Game game = new GameImpl(new CustomGameFactory(dice)); 

    dice.setDice(new int[] {4, 5}); 
    game.nextTurn(); 
    assertArrayEquals(new int[] {4, 5}, game.diceThrown()); 
    } 
} 

Con questo approccio qualsiasi dipendenza calcestruzzo può essere iniettato a scopo di test. Tuttavia, spesso lo stesso può essere ottenuto senza una fabbrica astratta, cioè piuttosto che iniettare una fabbrica, la dipendenza stessa può essere iniettata.