Bom, estou estudando o Abstract Factory e entendi que o mesmo é possui uma classe Factory Abstrata, ou seja, o cliente sempre chamará essa classe abstrata, e através dela que será feita a chamada as classes Concretas.
Mas o que eu não entendi é: Se a Classe é abstrata (AbstractFactory.java) com o cliente consegue instanciar um objeto da mesma ?
Em Java, uma AbstractFactory é definida como uma interface geralmente. Nesse caso, você tem que criar implementações da AbstractFactory. Leia bem a definição do padrão, e repare que ela só faz sentido se você precisa criar uma fábrica para famílias de objetos relacionados; Sendo assim, você precisa criar uma implementação da AbstractFactory para cada implementação da família de objetos; Geralmente, a escolha da implementação a ser usada é isolada também, você pode ler uma arquivo de configuração a instanciar via reflection, usar injeção de dependências, etc.
Ḿas pelo que li sobre este Padrão, o cliente só usa a Classe Abstrata e nem sabe que as concretas existem, sendo assim a dúvida é: Como ele usa a Classe Abstrata se ele é ABSTRATA ?
Ué, o tipo da variável pode ser uma classe abstrata, mas o objeto que ela referencia pertence a uma classe concreta, polimorfismo básico.
Pode dar um exemplo prático disso por gentileza ?
package exemplo;
interface WidgetFactory{
Button getButton();
TextArea getTextArea();
ComboBox getComboBox();
}
class DBWidgetFactory implements WidgetFactory{
Button getButton(){
return new DBButton();
}
TextArea getTextArea(){
return new DBTextArea();
}
ComboBox getComboBox(){
return new DBComboBox();
}
}
public class Main{
public static void main(String [] args) throws Throwable{
WidgetFactory factory = (WidgetFactory) Class.forName(args[0]).newInstance(); //o nome da classe concreta é passada via linha de comando
}
}
//java exemplo.Main exemplo.DBWidgetFactory