In [6]:
public interface Aquatic {
public String aquaticImage();
}
public class Crab implements Aquatic {
/*
o o
| |
/-----\
| |
\-----/
/ / \ \
*/
public String aquaticImage()
{
return " o o\n" +
" | |\n" +
"/-----\\\n" +
"| |\n" +
"\\-----/\n" +
"/ / \\ \\\n";
}
}
public class Fish implements Aquatic {
/* . _
|\/O\
|/\_/
*/
public String aquaticImage()
{
return ". _\n" +
"|\\/O\\\n" +
"|/\\_/\n";
}
}
public static void drawFishTank(Aquatic theAquatic)
{
System.out.println("+-----------------+");
System.out.println("| |");
System.out.println(theAquatic.aquaticImage());
System.out.println("| |");
System.out.println("+-----------------+");
}
Aquatic cb = new Crab();
drawFishTank(cb);
Aquatic fs = new Fish();
drawFishTank(fs);
Factory Method
Veja como o código é modificado de tal maneira que um método (createAquatic()
) passa a ser responsável pela criação dos seres aquáticos.
Então, em vez de usar new
e ter que referenciar a classe, você dispara o método criador:
Aquatic cb = ccb.createAquatic();
Aquatic fs = cfs.createAquatic();
Esse é o primeiro passo para isolar o processo de criação do cliente, ou seja, o cliente não toma conhecimento de como (em qual classe) o objeto é criado. Desse modo, quem fabrica terá a liberdade de mudar a implementação como desejar sem afetar o cliente.
In [7]:
public interface Aquatic {
public String aquaticImage();
}
public interface AquaticCreator {
public Aquatic createAquatic();
}
public class Crab implements Aquatic {
/*
o o
| |
/-----\
| |
\-----/
/ / \ \
*/
public String aquaticImage()
{
return " o o\n" +
" | |\n" +
"/-----\\\n" +
"| |\n" +
"\\-----/\n" +
"/ / \\ \\\n";
}
}
public class CrabCreator implements AquaticCreator {
public Aquatic createAquatic() {
return new Crab();
}
}
public class Fish implements Aquatic {
/* . _
|\/O\
|/\_/
*/
public String aquaticImage()
{
return ". _\n" +
"|\\/O\\\n" +
"|/\\_/\n";
}
}
public class FishCreator implements AquaticCreator {
public Aquatic createAquatic() {
return new Fish();
}
}
public static void drawFishTank(Aquatic theAquatic)
{
System.out.println("+-----------------+");
System.out.println("| |");
System.out.println(theAquatic.aquaticImage());
System.out.println("| |");
System.out.println("+-----------------+");
}
AquaticCreator ccb = new CrabCreator();
AquaticCreator cfs = new FishCreator();
Aquatic cb = ccb.createAquatic();
drawFishTank(cb);
Aquatic fs = cfs.createAquatic();
drawFishTank(fs);
In [4]:
import java.lang.Math;
class EmprestimoSimples {
private float s;
private int n;
private float j;
private int corrente;
private float p,
proxima;
public EmprestimoSimples(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 proximaParcela() {
if (corrente <= n)
p = s + ((corrente-1) * s * (j/100));
else
p = 0;
corrente++;
return p;
}
public float parcela() {
return p;
}
public float parcela(int numero) {
float resultado = 0;
if (numero <= n)
resultado = s + ((numero-1) * s * (j/100));
return resultado;
}
}
class EmprestimoComposto {
private float s;
private int n;
private float j;
private int corrente;
private float p,
proxima;
public EmprestimoComposto(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 proximaParcela() {
p = proxima;
corrente++;
if (corrente <= n)
proxima += (proxima * (j/100));
else
proxima = 0;
return p;
}
public float parcela() {
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
EmprestimoSimples emprestimo1 = new EmprestimoSimples(500, 7, 2);
EmprestimoComposto 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++;
}
In [ ]: