Estou treinando os design patterns com o seguinte mini-projeto:
As classes SSU e LSU implementam uma interface chamada rRNA; As classes SSU e LSU possuem as letras ACGU; Cada letra, por sua vez, é uma classe (a classe A representa a letra A e assim por diante); Cada letra não deve ser inicializada mais de uma vez, já que todos os "A"'s são iguais e assim por diante (todos os "U"s são iguais etc); É possível que um SSU e um LSU seja inicializado com muitas combinações possíveis de letras: A, AA, AAA, ACA, CAC e assim por diante.
A idéia, então, seria: 1 - Construir um flyweight para evitar que as letras sejam instanciadas mais de uma vez; 2 - Esse flyweight de letras entraria por composição nas classes SSU e LSU; 3 - As classes SSU e LSU seriam construídas com builders, usando métodos do tipo "comA", "comU" etc.
Enfim.. faz sentido? Tentei realizar esse projeto mas não acho que está correto.
Letras com flyweight:
public class LetrasComFlyweight {
static private Map<String, Letras> combinacoesRNA = new HashMap<>();
static {
combinacoesRNA.put("A", new A());
combinacoesRNA.put("C", new C());
combinacoesRNA.put("G", new G());
combinacoesRNA.put("U", new U());
}
public Letras pega(String nome) {
return this.combinacoesRNA.get(nome);
}
public Map<String, Letras> getCombinacoesRNA() {
return combinacoesRNA;
}
}
SSU1:
public class SSU1 implements rRNA {
private LetrasComFlyweight letras;
public SSU1() {
this.letras = new LetrasComFlyweight();
}
@Override
public String contagem() {
return "1800 nucleotídeos";
}
public LetrasComFlyweight getLetras() {
return this.letras;
}
}
Builder de SSU1:
public class BuilderDeSSU1 {
private SSU1 ssu1;
BuilderDeSSU1() {
this.ssu1 = new SSU1();
}
public BuilderDeSSU1 comA() {
ssu1.getLetras().pega("A");
return this;
}
public BuilderDeSSU1 comC() {
ssu1.getLetras().pega("C");
return this;
}
public BuilderDeSSU1 comG() {
ssu1.getLetras().pega("G");
return this;
}
public BuilderDeSSU1 comU() {
ssu1.getLetras().pega("U");
return this;
}
public SSU1 constroi() {
return new SSU1();
}
}
Teste:
public class Teste {
public static void main(String[] args) {
BuilderDeSSU1 ssu1 = new BuilderDeSSU1();
ssu1.comA()
.comC()
.constroi();
System.out.println(ssu1.constroi().getLetras().pega("U").letras());
}
(saída: null)
O código está correto?
Perguntas adicionais:
No caso, como eu poderia criar um "for" para analisar todas as letras que estão dentro do SSU?
E seria possível realizar a mesma ideia de um jeito melhor?
Obrigado!