Fábrica de Empréstimos

Exercício

Retomando o exemplo do Empréstimo codificado a seguir (classe geral Emprestimo que abstrai duas subclasses: EmprestimoSimples e EmprestimoComposto), escreva um método abstrato em que, dada uma String "simples" ou "composto", retorne o respectivo empréstimo.

Defina interfaces de tal maneira que as o cliente nunca faça referência direta a classes.


In [ ]:
import java.lang.Math;

public abstract class Emprestimo {
    protected float s;
    protected int   n;
    protected float j;
    protected int   corrente;
    protected float p,
                    proxima;

    public Emprestimo(float s, int n, float j) {
        this.s = s;
        this.n = n;
        this.j = j;
        corrente = 1;
        this.p = -1;  // antes da primeira parcela
        this.proxima = s;
    }

    float getS() {
        return s;
    }

    int getN() {
        return n;
    }
    
    float getJ() {
        return j;
    }

    public float parcela() {
        return p;
    }
    
    public abstract float proximaParcela();
    
    public abstract float parcela(int numero);
}

class EmprestimoSimples extends Emprestimo {
    public EmprestimoSimples(float s, int n, float j) {
        super(s, n, j);
    }

    public float proximaParcela() {
        if (corrente <= n)
            p = s + ((corrente-1) * s * (j/100));
        else
            p = 0;
        corrente++;
        return p;
    }
    
    public float parcela(int numero) {
        float resultado = 0;
        if (numero <= n)
            resultado = s + ((numero-1) * s * (j/100));
        return resultado;
    }
}


class EmprestimoComposto extends Emprestimo {
    public EmprestimoComposto(float s, int n, float j) {
        super(s, n, j);
    }

    public float proximaParcela() {
        p = proxima;
        corrente++;
        if (corrente <= n)
            proxima += (proxima * (j/100));
        else
            proxima = 0;
        return p;
    }
    
    public float parcela(int numero) {
        float resultado = 0;
        if (numero <= n)
            resultado = s * (float)Math.pow(1 + j/100, numero-1);
        return resultado;
    }
}

// codigo principal

Emprestimo emprestimo1 = new EmprestimoSimples(500, 7, 2);
Emprestimo emprestimo2 = new EmprestimoComposto(500, 7, 2);

int i = 1;
emprestimo1.proximaParcela();
emprestimo2.proximaParcela();
while (emprestimo1.parcela() > 0 || emprestimo2.parcela() > 0) {
    if (emprestimo1.parcela() > 0) {
        System.out.println("Emprestimo 1: parcela " + i + " eh " + emprestimo1.parcela());
        System.out.println("              parcela " + i + " eh " + emprestimo1.parcela(i));
    }
    if (emprestimo2.parcela() > 0) {
        System.out.println("Emprestimo 2: parcela " + i + " eh " + emprestimo2.parcela());
        System.out.println("              parcela " + i + " eh " + emprestimo2.parcela(i));
    }
    emprestimo1.proximaParcela();
    emprestimo2.proximaParcela();
    i++;
}