diagramma UML delle classi diagramma UML di sequenza
// Codice Java che mostra l'uso di dependency injection e object pool con il pattern Factory Method

/** SpCheck svolge il ruolo di Product */

public interface SpCheck {
	/** Controlla che la parola usata appartenga al dizionario */
	public boolean check(String word);
}
/** SpCheckEnglish svolge il ruolo di ConcreteProduct */

public class SpCheckEnglish implements SpCheck {

	@Override
	public boolean check(String word) {
		// TODO: Dovrebbe usare il dizionario inglese e le regole per stemming,
		// troncamento, etc.
		return word.equals("hello");
	}

}
/** SpCheckItalian svolge il ruolo di ConcreteProduct */

public class SpCheckItalian implements SpCheck {

	@Override
	public boolean check(String word) {
		// TODO: Dovrebbe usare il dizionario italiano e le regole per stemming,
		// troncamento, etc.
		return word.equals("ciao");
	}
}
/**
 * TextEditor conosce l'interfaccia SpCheck e non le sue implementazioni. La
 * dependency injection permette il disaccoppiamento fra TextEditor e la 
 * sottoclasse di SpCheck.
 */

public class TextEditor {
	private SpCheck speller;

	public TextEditor(SpCheck sp) {
		speller = sp;
	}

	/** inserisce una parola e controlla lo spelling */
	public void put(String word) {
		if (speller.check(word)) System.out.println("lingua usata OK :)");
		else System.out.println("lingua usata NON OK :(");
	}
}
import java.util.ArrayList;
import java.util.List;

/**
 * CreatorText svolge il ruolo di ConcreteCreator e usa la dependency injection
 * per la classe TextEditor. Vantaggio: TextEditor non conosce il tipo
 * dell'istanza usata, e si ha un unico posto per istanziare TextEditor e la
 * sottoclasse di SpCheck.
 **/

public class CreatorText {
	private static List< TextEditor > pool = new ArrayList< >();
	public static TextEditor getEng() {
		System.out.println("Crea un TextEditor con English");
		return new TextEditor(new SpCheckEnglish());
	}

	public static TextEditor getIta() {
		System.out.println("Crea un TextEditor con Italian");
		return new TextEditor(new SpCheckItalian());
	}

	// TODO: Aggiornare il diagramma UML delle classi
	/** ritorna, se esiste, una istanza dal pool */
	public static TextEditor getFromPool() {
		if (!pool.isEmpty()) return pool.remove(0);
		return new TextEditor(new SpCheckEnglish());
	}

	// TODO: Aggiornare il diagramma UML delle classi
	/** rilascia l'istanza */
	public static void release(TextEditor t) {
		pool.add(t);
	}
}
// classe con il metodo main
public class MainEditor {
	public static void main(String args[]) {
		TextEditor ed1 = CreatorText.getEng();
		System.out.println("Inserisce hello su Editor con spelling check inglese");
		ed1.put("hello");

		TextEditor ed2 = CreatorText.getIta();
		System.out.println("Inserisce ciao su Editor con spelling check italiano");
		ed2.put("ciao");

		System.out.println("Inserisce hello su Editor con spelling check italiano");
		ed2.put("hello");

		TextEditor ed3 = CreatorText.getFromPool();
		ed3.put("word");
		CreatorText.release(ed3);
	}
}