Il posto migliore per un'interfaccia di fabbrica

0

Qual è il posto migliore per un'interfaccia factory per creare un'istanza di un'altra interfaccia?

OpzioneA : una classe separata

public interface InterAFactory {
    InterA createInterA();
}

public interface InterA {
    void doStuff();
}

OpzioneB : una sottoclasse

public interface InterA {
    public interface Factory {
        InterA createInterA();
    }

    void doStuff();
}

Ho notato che il guava ha tendenzialmente usato B per le collezioni immutabili, ma è per i costruttori, che sono leggermente diversi dalle fabbriche. Tendo anche all'opzione B, in quanto riduce il numero di classi di primo livello nel pacchetto e associa strongmente la fabbrica con ciò che crea. Tuttavia, le implementazioni non saranno vincolate o influenzate da questo, e renderà le implementazioni della factory leggermente più dettagliate. Pensieri?

    
posta thecoop 02.12.2013 - 15:01
fonte

2 risposte

1

I costruttori di guava sono un po 'diversi. ImmutableList.Builder esiste solo perché ImmutableList non vuole aprire il suo costruttore. Quindi il solo modo per creare un ImmutableList è tramite Builder , che è una classe interna strettamente associata, il che ha senso.

Nel tuo caso, penso che dipenda dalla natura degli oggetti di cui stiamo parlando. Considerare

interface Vehicle { interface Factory { createVehicle(); }}

class Bmw implements Vehicle {
  // complex code
}

class BmwFactory implements Vehicle.Factory {
  // more complex code
}

class Fiat implements Vehicle {
  public Fiat() { }
  // no need for a factory at all here, but there's still a guilty feeling
  // that inner interface had better been implemented...
}

Che credo sia a posto ... Hai appena finito di usare Vehicle. come praticamente un nome di pacchetto. Personalmente, andrei con l'opzione a)

    
risposta data 03.12.2013 - 02:05
fonte
0

Il mio gusto personale è usare una variazione di (a) con generici:

OpzioneA *: una classe separata con generici

public interface Factory<T> {
    T create();
}

Quindi hai solo un'interfaccia di fabbrica per molti tipi diversi. Questo non è possibile con (b).

Lo uso in c # / dotnet per un factory di repository per diversi tipi di articoli. In java dovrebbe essere simile.

    
risposta data 02.12.2013 - 18:29
fonte

Leggi altre domande sui tag