1
resposta

Projeto com flyweight e builder

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!

1 resposta

Os nomes das classes "SSU1" e "rRNA" estão fora da convenção de nomes para o Java

Os nomes das classes devem ser substantivos, em maiúsculas e minúsculas, com a primeira letra de cada palavra interna em maiúscula. Tente manter os nomes das classes simples e descritivos. Use palavras inteiras - evite acrônimos e abreviações (a menos que a abreviatura seja muito mais usada do que a forma longa, como URL ou HTML).

Fora isso parece ok