Esempio: un lettore di documenti universale

Supponiamo di voler implementare un sistema per l'apertura di formati di documenti di diverso tipo: RTF, DOC e PDF [3]. Definiamo intanto un'interfaccia comune che espone il metodo di apertura di un documento, il cui nome è passato come parametro, che tutti i documenti concreti devono implementare:

public interface Document {
public void openDocument(String documentName);
}

public class PDFDocument { public void openDocument(String documentName) {

// ... elaborazione del file ... System.out.println("Apro il documento PDF: "+documentName);

} }

public class DocumentManager {
public void open(String documentType, String documentName)
		throws Exception
	{

		Class docClass = Class.forName("it.ep.reflection."+documentType);

		Document realDocument = (Document)docClass.cast(docClass.newInstance());

		realDocument.openDocument(documentName);

	}
}

/ creazione dinamica di documenti / DocumentManager dm = new DocumentManager();

dm.open("PDFDocument", "filepdf.pdf");

dm.open("DOCDocument", "filedoc.doc");

dm.open("RTFDocument", "rtf.rtf"); Vediamo nel dettaglio i partecipanti al pattern: AbstractFactory (interfaccia DocumentFactory): definisce un metodo per creare e restituire nuovi documenti. Il tipo restituito è AbstractProduct. ConcreteFactory (classi PDFDocumentFactory, RTFDocumentFactory e DOCDocumentFactory): implementano l'AbstractFactory, fornendo il metodo per creare e restituire documenti concreti - ConcreteProduct. AbstractProduct (interfaccia Document): definisce le operazioni comuni ai diversi documenti. Nel nostro caso, il metodo per l'apertura del documento. ConcreteProduct (classi PDFDocument, RTFDocument e DOCDocument): definiscono i documenti concreti, creati da ogni ConcreteFactory. Client (classe DocumentManager): utilizza l'AbstractFactory per rivolgersi alle ConcreteFactory di un particolare documento. Può utilizzare i diversi documenti attraverso la loro interfaccia comune fornita da AbstractProduct, invocando quindi il metodo di apertura del documento. Questo è il punto più geniale ed elegante del pattern: infatti, il client crea nuove istanze di documenti senza realmente sapere quale sta utilizzando in un particolare istante, grazie all'utilizzo del DocumentFactory. public interface DocumentFactory { public Document createDocument();

}

public class PDFDocumentFactory implements DocumentFactory {
public Document createDocument() {

		return new PDFDocument();

	}
}

public class DocumentManager { public void selectDocument(DocumentFactory documentType) {

this.documentType = documentType;

} public void open(String documentName) {

Document document = documentType.createDocument();

document.openDocument(documentName);

} private DocumentFactory documentType; }

DocumentManager dm = new DocumentManager();

dm.selectDocument(new PDFDocumentFactory());

dm.open("filepdf.pdf");

dm.selectDocument(new DOCDocumentFactory());

dm.open("filedoc.doc");

dm.selectDocument(new RTFDocumentFactory());

dm.open("filertf.rtf");