eu conheço (pode não ser tão avançado) esses dois padrões, mas acho que não serve para esse caso…
Vamos la, vamos supor que eu queira um factory de figuras (classico):
Minhas figuras:
interface Figura
{
void desenhar();
}
class Retangulo implements Figura
{
public void desenhar()
{
}
}
class Circulo implements Figura
{
public void desenhar()
{
}
}
meu factory:
abstract class Factory
{
abstract Figura create();
static Figura getFigura(int tipo)
{
switch (tipo)
{
case 1:
return new CirculoFactory().create();
case 2:
return new RetanguloFactory().create();
}
throw new IllegalArgumentException();
}
}
class CirculoFactory extends Factory
{
public Figura create()
{
return new Circulo();
}
}
class RetanguloFactory extends Factory
{
public Figura create()
{
return new Retangulo();
}
}
Tah, eh um factory bem ‘tosco’, mas blz, como eu uso isso?!
Factory.getFigura(1)
ou
Factory.getFigura(2)
ou no caso se meu parâmetro fosse string
Factory.getFigura("circulo")
ou
Factory.getFigura("rentagulo")
ou agora se eu tivesse um enum enumerando as figuras que o factory pode construir
enum Figura {
CIRCULO, RETANGULO;
}
Factory.getFigura(Figura.CIRCULO)
ou
Factory.getFigura(Figura.RENTAGULO)
qual desses 3 vc acha melhor?! eu particularmente acho o terceiro com enum já que é checado. O que pensei foi, se o Factory vai criar todos objetos enumerados no enum, porque não deixar para o proprio enum criar a figura? no caso desse exemplo (da figura) eu NÃO faria com enum, pois existem inumeras formas de se criar um circulo (muda o comportamento do método desenhar), e não apenas uma forma, então acho que justifica ter um factory e o enum serviria apenas como parâmetro para o factory. Mas no exemplo das configurações do meu simulador acho que se aplica, não vai existir outra forma de se criar a configuração 1 (assim como não existe outra forma de criar a cor azul, vai ser sempre rgb 0,0,255), essa conf sempre sera com valores 1.1, 2.2, 3.3 e 4.4, como não vai haver outra forma de criar ela, porque não deixar para que o enum que representa ela crie?!
Agora as cores são padrões mundiais, então eu até “aceito” (embora ache feio) colocar as cores na própria classe Color como public static, mas minhas configurações não são padrões mundiais, aqui no Brasil usa-se 15 padrões com um valor, no Canada pode usar 10 padrões com outros valores, então não acho certo colocar como public static na classe Configuracao.
Tah, eu quero que vc me passe um codigo de como vc implementaria as cores padrões da classe Color sendo que “cor padrão” não é uma coisa unica em todo mundo, as cores padrões aqui no Brasil são o GREEN, YELLOW e MAGENTA, para o Canada são o CYAN, PINK e BLUE, e assim por diante, cada pais tem suas cores… e você quer que sua classe Color possa ser usada por qualquer um em todo mundo, mas claro, 90% das das pessoas que vão usar são brasileiras, então seria bom que vc tivesse uma pré implementação delas para esses usuários. O que você faz?! não vai criar todas cores padrões de todos paises do mundo na classe Color, seriam uma lambanssa que ninguem acharia nada, mas tb não vai colocar só as do Brasil, porque isso não interessa para o resto do mundo. Então para esse caso, eu pensei em criar um enum para representa-las:
enum CoresBrasil {
GREEN() {
Color get() {
return new Color(0, 255, 0);
}
};
public abstract Color get();
}
porque?!
não muda jamais, não existe outra forma de implementar o Color.GREEN no brasil, então não justificaria ter um Factory para ele, mas como ela é um padrão só aqui no brasil, não justificaria tb estar previamente criada como public static final Color GREEN na clase Color que é usada em todo mundo. Eu gostaria de sugestões de como fazer, ou melhor, ver como vocês fariam…
de qq forma, eu acho que ninguem mais vai responder, muita coisa escrita ja
flw