Il mio file system implementato utilizzando il pattern Composite richiede un singleton?

1

Sto esplorando pattern composito per scrivere un file system, uno dei miei requisiti è creare un elemento radice univoco in questo caso una directory, simile a Linux System ('/'), ho visto molti esempi di creare questo nel client in questo modo:

class CompositeDemo
{
    public static StringBuffer g_indent = new StringBuffer();

    public static void main(String[] args)
    {
        Directory one = new Directory("dir111");
        Directory two = new Directory("dir222");
        Directory thr = new Directory("dir333");
        File a = new File("a");
        File b = new File("b");
        File c = new File("c");
        File d = new File("d");
        File e = new File("e");
        one.add(a);
        one.add(two);
        one.add(b);
        two.add(c);
        two.add(d);
        two.add(thr);
        thr.add(e);
        one.ls();
    }
}

Fonte: link

Poiché la mia esigenza è quella di creare un nodo radice univoco, è consigliabile creare una nuova classe che abbia un solo elemento radice? Posso usare un modello di design Singleton?

    
posta spicyramen 03.01.2017 - 07:38
fonte

1 risposta

4

Singleton viene utilizzato quando si desidera solo una singola istanza di una classe. Questo è spesso erroneamente applicato: dovrebbe essere usato solo quando più istanze potrebbero causare un problema, non quando è conveniente avere una singola istanza. Molto raramente vedo un singleton che in realtà deve essere un singleton (ma esistono).

In questo caso, non avrà una singola istanza del composito: avrai una singola istanza chiamata "root". Ogni directory è un composito, con i file come foglie.

Vorrei solo creare il tuo file system e avere un metodo che restituisce il nodo root su richiesta. In sostanza, il file system si comporta come un singleton, non l' oggetto composito stesso.

Nel codice, sarebbe simile a questo:

private Directory root;

public Directory getRoot() {
  if (root == null) {
    root = createFileSystem();
  }
  return root;
}

private Directory createFileSystem() {
  Directory r = new Directory("");
  // Add more directories and files here.
  return r;
}

Nota: raccomando di farlo in questo modo e non di manipolare root direttamente nella logica di creazione per applicare SRP e evitare di infettare bug. Potrebbe valere la pena aggiungere un oggetto Lock Java se più thread possono accedere a getRoot() alla volta prima che la radice sia inizializzata. Separando la logica in questo modo è anche possibile reinizializzare il file system mentre altri thread stanno ancora utilizzando la vecchia versione, senza che i thread vengano bloccati.

    
risposta data 03.01.2017 - 08:45
fonte

Leggi altre domande sui tag