1. Abstract Factory: Nos permite crear, mediante una interfaz, conjuntos o familias de objetos (denominados productos) que dependen mutuamente y todo esto sin especificar cual es el objeto concreto. Este patrón se aplica cuando un sistema debe ser independiente de como sus objetos son creados, cuando un sistema deber ser 'configurado' con una cierta familia de productos y se necesita reforzar la noción de dependencia mutua entre ciertos objetos.
Representación UML
Ejemplo
Se Crea una interface Bank(Banco).
- import java.io.*;
- interface Bank{
- String getBankName();
- }
Se crea las clases concretas que implementa la interface Bank.
- class HDFC implements Bank{
- private final String BNAME;
- public HDFC(){
- BNAME="HDFC BANK";
- }
- public String getBankName() {
- return BNAME;
- }
- }
- class ICICI implements Bank{
- private final String BNAME;
- ICICI(){
- BNAME="ICICI BANK";
- }
- public String getBankName() {
- return BNAME;
- }
- }
- class SBI implements Bank{
- private final String BNAME;
- public SBI(){
- BNAME="SBI BANK";
- }
- public String getBankName(){
- return BNAME;
- }
- }
Se crea la clase abstracta Loan.
- abstract class Loan{
- protected double rate;
- abstract void getInterestRate(double rate);
- public void calculateLoanPayment(double loanamount, int years)
- {
-
-
-
-
-
-
-
-
-
-
- double EMI;
- int n;
-
- n=years*12;
- rate=rate/1200;
- EMI=((rate*Math.pow((1+rate),n))/((Math.pow((1+rate),n))-1))*loanamount;
-
- System.out.println("your monthly EMI is "+ EMI +" for the amount"+loanamount+
- " you have borrowed");
- }
- }
Se crea las clases concretas que extiende la clase abstracta Loan
- class HomeLoan extends Loan{
- public void getInterestRate(double r){
- rate=r;
- }
- }
- class BussinessLoan extends Loan{
- public void getInterestRate(double r){
- rate=r;
- }
-
- }
- class EducationLoan extends Loan{
- public void getInterestRate(double r){
- rate=r;
- }
- }
Se crear una clase abstracta (Ex. AbstractFactory) a obtener los factores para los Objetos Bank y Loan
- abstract class AbstractFactory{
- public abstract Bank getBank(String bank);
- public abstract Loan getLoan(String loan);
- }
Crea las clases factores que hereda la clase AbstractFactory a generar el objeto de la clase concreta en la información dada
- class BankFactory extends AbstractFactory{
- public Bank getBank(String bank){
- if(bank == null){
- return null;
- }
- if(bank.equalsIgnoreCase("HDFC")){
- return new HDFC();
- } else if(bank.equalsIgnoreCase("ICICI")){
- return new ICICI();
- } else if(bank.equalsIgnoreCase("SBI")){
- return new SBI();
- }
- return null;
- }
- public Loan getLoan(String loan) {
- return null;
- }
- }
- class LoanFactory extends AbstractFactory{
- public Bank getBank(String bank){
- return null;
- }
-
- public Loan getLoan(String loan){
- if(loan == null){
- return null;
- }
- if(loan.equalsIgnoreCase("Home")){
- return new HomeLoan();
- } else if(loan.equalsIgnoreCase("Business")){
- return new BussinessLoan();
- } else if(loan.equalsIgnoreCase("Education")){
- return new EducationLoan();
- }
- return null;
- }
-
- }
Se crea una clase FactoryCreator a obtener los factores para pasar información tal como Bank or Loan.
- class FactoryCreator {
- public static AbstractFactory getFactory(String choice){
- if(choice.equalsIgnoreCase("Bank")){
- return new BankFactory();
- } else if(choice.equalsIgnoreCase("Loan")){
- return new LoanFactory();
- }
- return null;
- }
- }
Use el FactoryCreator a obtener AbstractFactory en orden a ir a los factores de clases concretas para pasar una innformación tal como el tipo.
- import java.io.*;
- class AbstractFactoryPatternExample {
- public static void main(String args[])throws IOException {
-
- BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
-
- System.out.print("Enter the name of Bank from where you want to take loan amount: ");
- String bankName=br.readLine();
-
- System.out.print("\n");
- System.out.print("Enter the type of loan e.g. home loan or business loan or education loan : ");
-
- String loanName=br.readLine();
- AbstractFactory bankFactory = FactoryCreator.getFactory("Bank");
- Bank b=bankFactory.getBank(bankName);
-
- System.out.print("\n");
- System.out.print("Enter the interest rate for "+b.getBankName()+ ": ");
-
- double rate=Double.parseDouble(br.readLine());
- System.out.print("\n");
- System.out.print("Enter the loan amount you want to take: ");
-
- double loanAmount=Double.parseDouble(br.readLine());
- System.out.print("\n");
- System.out.print("Enter the number of years to pay your entire loan amount: ");
- int years=Integer.parseInt(br.readLine());
-
- System.out.print("\n");
- System.out.println("you are taking the loan from "+ b.getBankName());
-
- AbstractFactory loanFactory = FactoryCreator.getFactory("Loan");
- Loan l=loanFactory.getLoan(loanName);
- l.getInterestRate(rate);
- l.calculateLoanPayment(loanAmount,years);
- }
- }
2. Builder: Este patrón permite separar la construcción de un objeto complejo de su representación, de modo que el mismo proceso de construcción puede crear diferentes representaciones de este objeto. En términos generales un builder esconde los detalles de la creación de un objeto final que se llama producto. Hay varios métodos para lograr esto, y por ello hay varias "implementaciones" de este patrón que en nada coinciden, salvo en nombre.
Representación UML
Ejemplo
A continuación mostramos un ejemplo en el que utilizamos este patrón de diseño para construir diferentes tipos de objetos Coche() con un determinado equipamiento de serie cada uno de ellos(básico, medio y full equipo):
- package Builder01;
public class Main
{
public static void main(String[] args)
{
// Crear el objeto Director
Director objFabrica = new Director();
// Crear los objetos ConcreteBuilder
BuilderCoche base = new ConstructorCocheBase();
BuilderCoche medio = new ConstructorCocheMedio();
BuilderCoche full = new ConstructorCocheFull();
// Construir un coche con equipamiento base
objFabrica.construir( base );
Coche cocheBase = base.getCoche();
// Construir un coche con equipamiento medio
objFabrica.construir( medio );
Coche cocheMedio = medio.getCoche();
// Construir un coche con equipamiento full
objFabrica.construir( full );
Coche cocheFull = full.getCoche();
// Mostrar la información de cada coche creado
mostrarCaracteristicas( cocheBase );
mostrarCaracteristicas( cocheMedio );
mostrarCaracteristicas( cocheFull );
}
// --------------------------------
public static void mostrarCaracteristicas( Coche coche )
{
System.out.println( "Motor: " + coche.getMotor() );
System.out.println( "Carrocería: " + coche.getCarroceria() );
System.out.println( "Elevalunas eléctrico: " + coche.getElevalunasElec() );
System.out.println( "Airea acondicionado: " + coche.getAireAcond() );
System.out.println("===================================");
}
}
Director
BuilderCoche.java(un Builder en el diagrama anterior):
ConstructorCocheBase.java(un ConcreteBuilder en el diagrama anterior):
ConstructorCocheMedio.java (un ConcreteBuilder en el diagrama anterior):
ConstructorCocheFull.java (un ConcreteBuilder en el diagrama anterior):
Coche.java (un Product en el diagrama anterior):
En el programa principal creamos el objeto de tipo Director, así como los de tipo ConcreteBuilder que le iremos pasando a continuación como parámetro a través de su método construir() ( con el fin de crear objetos Coche equipados de diferentes formas). Observa que en dicho método se llama a su vez a los diferentes métodos de la clase BuilderCoche, mediante los que se crea un nuevo objeto de tipo Coche y se componen las diferentes partes del mismo. Posteriormente se realiza una llamada al método getCoche() del objeto de tipo Director para obtener cada objeto de tipo Coche, y se muestran sus características.
No hay comentarios:
Publicar un comentario