2010-06-03 9 views
5

perché abbiamo bisogno di un modello di progettazione Abstract Factory per creare oggetti? Perché non possiamo semplicemente usare il nuovo operatore? La risposta è, per evitare un accoppiamento stretto degli oggetti. Ma non ho capito come? qualcuno può spiegare con il codice (sarà molto utile).Abstract Pattern di progettazione di fabbrica per creare oggetti? Perché non possiamo semplicemente usare il nuovo operatore?

ciò che rende utile il disegno astratto del modello di fabbrica e quando.

Grazie in anticipo. Harsha T

+4

Ci sono così tante buone spiegazioni (come il link di Enrico in basso) di questo si trovano con un google o due non vedo davvero alcun valore nel riprodurre qualsiasi qui. Se trovi una spiegazione che sembra poco convincente, forse una domanda sugli aspetti specifici di quella spiegazione sarebbe più interessante. – djna

risposta

2

Se si utilizza l'operatore new, è necessario specificare il tipo esatto desiderato. A volte si desidera essere più generico, ad esempio perché si desidera poter modificare rapidamente il tipo di istanza in tutto il codebase.

2

Un modello astratto disegno fabbrica è stato progettato per creare un oggetto con una configurazione specifica in fase di inizializzazione. Ad esempio, se hai molte classi connesse in modo simile, invece di ripetere le stesse 4+ linee [e usando la copia e incolla], la fabbrica astratta ti permetterebbe di mantenere le 4+ linee in una singola posizione e di ridurre la quantità di cambiamenti necessari.

Reference For Abstract Factory

0

C'è una piuttosto buona C# esempio su Wikipedia. Mantiene il tuo codice a livello di applicazione dal dover sapere quali implementazioni sta ottenendo. La fabbrica si prende cura di lui.

0

Utilizzando una fabbrica astratta, è possibile creare oggetti senza conoscere il tipo effettivo. Diciamo che hai bisogno di un IDictionary. Potresti creare una nuova istanza di una classe ad albero binario che ti capita di conoscere, oppure potresti dire allo stabilimento di IDictionary che hai bisogno di una nuova istanza. Quindi qualcun altro potrebbe creare un'implementazione di fabbrica che restituisce hash-tables, ma tutto ciò che dalla tua parte funzionerà ancora allo stesso modo.

0
  • prima di tutto non è necessario conoscere il tipo specifico di oggetto vostra fabbrica è istanziare,
  • quindi è possibile collegare le classi factory intorno alla vostra progetto permettendo loro di istanziare oggetti per i componenti senza dover utilizzare new nel codice. La fabbrica già fare il suo sporco lavoro
  • separa concettualmente l'istanza di oggetto dal loro utilizzo, mantenendo le cose disaccoppiati
1

Ecco un semplice esempio derivato da uno strato versione indipendenza che ho costruito per il nostro prodotto:

interface ICadSystemFactory 
{ 
    ICadSystem GetSystemInstance(); 
} 

class 3dCadSystemVersion1 : ICadSystemFactory 
{ 
    ICadSystem GetSystemInstance() 
    { 
     return new 3dCadSystemWrapperVersion1(new 3dCadSystemVersion1()); 
    } 
} 



class 3dCadSystemVersion2 : ICadSystemFactory 
{ 
    ICadSystem GetSystemInstance() 
    { 
     return new 3dCadSystemWrapperVersion2(new 3dCadSystemVersion2()); 
    } 
} 

Dove gli oggetti 3dCadSystemWrapperVersionX implementano l'interfaccia ICadSystem. Uso un oggetto Registry per decidere quale factory di base voglio creare in base a determinati identificatori di versione. Questo mi consente di collegare nuove versioni, se necessario, senza disturbare l'infrastruttura esistente, che risulta utile in questo caso. In effetti, mi permetterebbe di inserire nuovi prodotti se fosse necessario, il che potrebbe essere generalmente utile, ma nel mio caso non vale lo sforzo di implementazione.

2

Se avete:

class Foo implements DoSomething {...} 
class Bar implements DoSomething {...} 

obj = new Foo(); 
obj.doSomething(); 

Ovunque nel codice, una volta che si desidera modificare tutte le istanze di Foo per utilizzare le istanze di Bar, sono davvero intenzione di fare ricerca/sostituzione?


Se si dispone di:

obj = DoSomethingFactory.create(); 
obj.doSomething(); 

All'interno del DoSomethingFactory, è possibile restituire qualsiasi oggetto che si desidera che implementa l'interfaccia DoSomething.

Utilizzando una Fabbrica, si ha il controllo su tutti gli oggetti da essa creati.

Se si decide di modificare il modo in cui la Fabbrica crea oggetti, le modifiche hanno effetto immediato nel codice che utilizza la Fabbrica.

Problemi correlati