SlideShare uma empresa Scribd logo
1 de 14
Baixar para ler offline
Factory Method 
Autentia - Buen Diseño
Intención 
“Define an interface for creating an object, but 
let subclasses decide which class to instantiate. 
Factory Method let a class defer instantiation to 
subclasses.” 
Gamma et. al
Diagrama de Clases clásico
¿Cuándo usarlo? 
● Abstraer a la clase cliente sobre qué clase concreta de 
una familia tiene que usar. 
● Delegar la decisión de qué clases se van a instanciar 
en las clases hijas. 
● Desacoplar la complejidad de la instanciación. 
● Como alternativa a los constructores (Static FM). 
● Para hacer más extensible la arquitectura.
Pero no debemos usarlo siempre 
Como todos los patrones: no se debe forzar su uso si no es 
necesario. 
● Necesitamos una familia de objetos sobre los que 
trabajar 
● Puede aumentar la complejidad de la aplicación 
introduciendo más niveles de indirección. 
● No caer en la tentación de aplicarlo por si en el futuro 
es necesario.
Tipos de Implementación 
En general hay 4 tipos de implementación 
1. Factoría padre abstracta que delega siempre en las 
Factorías hijas. 
2. Factoría padre que devuelve valor por defecto y casos 
especiales en Factorías Hijas. 
3. Factoría padre con tipo por parámetro. 
Y también: 
4. Variante: Static Factory Method.
Ejemplo 
Familia de productos “Pelota” para diferentes 
deportes. 
public abstract class Pelota { 
float diametro; 
float peso; 
String material; 
public abstract String getTipo(); 
//Getters y Setters... 
} 
public class BaloncestoPelota extends Pelota { 
public String getTipo() { 
return "pelota de Baloncesto"; 
} 
} 
public class FutbolPelota extends Pelota { 
public String getTipo() { 
return "una pelota de fútbol"; 
} 
} 
public class TenisPelota extends Pelota { 
public String getTipo() { 
return "pelota de tenis"; 
} 
} 
public class GenericaPelota extends Pelota { 
public String getTipo() { 
return "pelota genérica"; 
} 
}
Ejemplo 
Deportistas a los que asignar una pelota para 
su deporte. 
public class Deportista { 
String nombre; 
Pelota pelota; 
public Deportista(String nombre) { 
this.nombre = nombre; 
} 
public String getSaludo() { 
return "Hola, soy " + getNombre() + " y juego con una pelota de " 
+ getPelota().getTipo() + " que pesa " + getPelota().getPeso() 
+ " gramos"; 
} 
//Getters y Setters... 
}
Ejemplo 
Familia de fábricas que construyen productos 
pelota concreta en cada método (tipo 1) 
public interface FactoryPelotas { 
public Pelota create(); 
} 
public class FactoryBaloncestoPelotas implements 
FactoryPelotas { 
public Pelota create() { 
return new BaloncestoPelota(); 
} 
} 
public class FactoryFutbolPelotas implements 
FactoryPelotas { 
public Pelota create() { 
return new FutbolPelota(); 
} 
} 
public class FactoryTenisPelotas implements 
FactoryPelotas { 
public Pelota create() { 
return new TenisPelota(); 
} 
}
Ejemplo 
Main (Cliente que usa productos) 
public class main { 
public static void main(String[] args) { 
ArrayList<Deportista> deportistas = new ArrayList<Deportista>(); 
// Definición de deportistas 
Deportista baloncestoDep = new Deportista("Gasol"); 
Deportista futbolDep = new Deportista("Messi"); 
Deportista tenisDep = new Deportista("Nadal"); 
// Fábricas concretas 
baloncestoDep.setPelota(new FactoryBaloncestoPelotas().create()); 
futbolDep.setPelota(new FactoryFutbolPelotas().create()); 
tenisDep.setPelota(new FactoryTenisPelotas().create()); 
deportistas.add(baloncestoDep); 
deportistas.add(futbolDep); 
deportistas.add(tenisDep); 
for (Deportista dep : deportistas) { 
dep.getPelota().setPeso((float) Math.random() * 500); 
System.out.println( dep.getSaludo()); 
}} 
}
Factory con parámetro (tipo 3) 
public class FactoryParamPelotas { 
public static Pelota create(TipoPelota tipo) { 
Pelota salida; 
switch (tipo) { 
case BALONCESTO: 
salida = new BaloncestoPelota(); 
break; 
case TENIS: 
salida = new TenisPelota(); 
break; 
case FUTBOL: 
salida = new FutbolPelota(); 
break; 
default: 
salida = new GenericaPelota(); 
break; 
} 
return salida; 
} 
} 
…… 
baloncestoDep.setPelota( FactoryParamPelotas.create(TipoPelota.BALONCESTO)); 
baloncestoDep.setPelota( FactoryParamPelotas.create(TipoPelota.FUTBOL)); 
baloncestoDep.setPelota( FactoryParamPelotas.create(TipoPelota.TENIS));
Static Factory Method 
Método estático que sustituye al constructor 
Foo x = new Foo(); 
vs. 
Foo x = Foo.create(); 
...o usando parámetros en la superclase 
Foo x = Foo.create(tipo1); 
también mejora la legibilidad del código 
Punto punto = new Punto(x,y, sistemaMedicion); 
si lo cambiamos por 
Punto punto = Punto.createByMetros(x,y); 
Punto punto2 = Punto.createByInches(x,y);
Relación con Abstract Factory 
AF es un nivel superior de abstracción
Gracias!

Mais conteúdo relacionado

Mais procurados

Classes, objects in JAVA
Classes, objects in JAVAClasses, objects in JAVA
Classes, objects in JAVA
Abhilash Nair
 
Herencia - Programación Orientada a Objetos
Herencia - Programación Orientada a ObjetosHerencia - Programación Orientada a Objetos
Herencia - Programación Orientada a Objetos
Mario Villaseñor
 
Object Oriented Programming with Java
Object Oriented Programming with JavaObject Oriented Programming with Java
Object Oriented Programming with Java
backdoor
 

Mais procurados (20)

Strings in Java
Strings in JavaStrings in Java
Strings in Java
 
Classes, objects in JAVA
Classes, objects in JAVAClasses, objects in JAVA
Classes, objects in JAVA
 
Herencia Y Polimorfismo
Herencia Y PolimorfismoHerencia Y Polimorfismo
Herencia Y Polimorfismo
 
ORACLE PL SQL FOR BEGINNERS
ORACLE PL SQL FOR BEGINNERSORACLE PL SQL FOR BEGINNERS
ORACLE PL SQL FOR BEGINNERS
 
Multi-threaded Programming in JAVA
Multi-threaded Programming in JAVAMulti-threaded Programming in JAVA
Multi-threaded Programming in JAVA
 
13 Curso de POO en java - métodos propios de clase
13 Curso de POO en java - métodos propios de clase13 Curso de POO en java - métodos propios de clase
13 Curso de POO en java - métodos propios de clase
 
Herencia - Programación Orientada a Objetos
Herencia - Programación Orientada a ObjetosHerencia - Programación Orientada a Objetos
Herencia - Programación Orientada a Objetos
 
Java interface
Java interfaceJava interface
Java interface
 
Asynchronous programming in C#
Asynchronous programming in C#Asynchronous programming in C#
Asynchronous programming in C#
 
Class and Objects in Java
Class and Objects in JavaClass and Objects in Java
Class and Objects in Java
 
Class, object and inheritance in python
Class, object and inheritance in pythonClass, object and inheritance in python
Class, object and inheritance in python
 
Programación 3: clases derivadas y polimorfismo
Programación 3: clases derivadas y polimorfismoProgramación 3: clases derivadas y polimorfismo
Programación 3: clases derivadas y polimorfismo
 
Collections and its types in C# (with examples)
Collections and its types in C# (with examples)Collections and its types in C# (with examples)
Collections and its types in C# (with examples)
 
Method overloading, recursion, passing and returning objects from method, new...
Method overloading, recursion, passing and returning objects from method, new...Method overloading, recursion, passing and returning objects from method, new...
Method overloading, recursion, passing and returning objects from method, new...
 
Java 8 features
Java 8 featuresJava 8 features
Java 8 features
 
Constructor ppt
Constructor pptConstructor ppt
Constructor ppt
 
Javapolymorphism
JavapolymorphismJavapolymorphism
Javapolymorphism
 
Object Oriented Programming with Java
Object Oriented Programming with JavaObject Oriented Programming with Java
Object Oriented Programming with Java
 
Unidad 5 VARIABLES Y MÉTODOS ESTÁTICOS
Unidad 5 VARIABLES Y MÉTODOS ESTÁTICOSUnidad 5 VARIABLES Y MÉTODOS ESTÁTICOS
Unidad 5 VARIABLES Y MÉTODOS ESTÁTICOS
 
Java: Inheritance
Java: InheritanceJava: Inheritance
Java: Inheritance
 

Destaque

Método fabrica (Method Factory)
Método fabrica (Method Factory)Método fabrica (Method Factory)
Método fabrica (Method Factory)
Jonathan Calero
 

Destaque (20)

Factory method
Factory methodFactory method
Factory method
 
Flex observers
Flex observersFlex observers
Flex observers
 
Design Patterns / Patrones de Diseño
Design Patterns / Patrones de DiseñoDesign Patterns / Patrones de Diseño
Design Patterns / Patrones de Diseño
 
Presentación open closed principle
Presentación open closed principlePresentación open closed principle
Presentación open closed principle
 
Patrón Façade
Patrón FaçadePatrón Façade
Patrón Façade
 
Patrones estructurales
Patrones estructuralesPatrones estructurales
Patrones estructurales
 
Patrón Decorator
Patrón DecoratorPatrón Decorator
Patrón Decorator
 
Measuring code quality:WTF/min by @dgomezg
Measuring code quality:WTF/min by @dgomezgMeasuring code quality:WTF/min by @dgomezg
Measuring code quality:WTF/min by @dgomezg
 
Patrones Creacionales
Patrones CreacionalesPatrones Creacionales
Patrones Creacionales
 
Patrón Observer
Patrón ObserverPatrón Observer
Patrón Observer
 
Método fabrica (Method Factory)
Método fabrica (Method Factory)Método fabrica (Method Factory)
Método fabrica (Method Factory)
 
Nativescript
NativescriptNativescript
Nativescript
 
Singleton
SingletonSingleton
Singleton
 
Factory Design Pattern
Factory Design PatternFactory Design Pattern
Factory Design Pattern
 
Patrones de creación
Patrones de creaciónPatrones de creación
Patrones de creación
 
Patrones de diseño: Polimorfismo
Patrones de diseño: PolimorfismoPatrones de diseño: Polimorfismo
Patrones de diseño: Polimorfismo
 
Design Pattern - Factory Method Pattern
Design Pattern - Factory Method PatternDesign Pattern - Factory Method Pattern
Design Pattern - Factory Method Pattern
 
Factory Method Pattern
Factory Method PatternFactory Method Pattern
Factory Method Pattern
 
Design pattern (Abstract Factory & Singleton)
Design pattern (Abstract Factory & Singleton)Design pattern (Abstract Factory & Singleton)
Design pattern (Abstract Factory & Singleton)
 
Presentacion Patrones Creacionales
Presentacion Patrones CreacionalesPresentacion Patrones Creacionales
Presentacion Patrones Creacionales
 

Semelhante a Factory method

Java::Acceso a Bases de Datos
Java::Acceso a Bases de DatosJava::Acceso a Bases de Datos
Java::Acceso a Bases de Datos
jubacalo
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUG
Jordi Gerona
 
Cuadrado y cubo de un numero
Cuadrado y cubo de un numeroCuadrado y cubo de un numero
Cuadrado y cubo de un numero
Robert Wolf
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggers
Luis Jherry
 
Tips componentes swing_v5
Tips componentes swing_v5Tips componentes swing_v5
Tips componentes swing_v5
ggzhack
 
Informetecnicou2 topicos
Informetecnicou2 topicosInformetecnicou2 topicos
Informetecnicou2 topicos
Kanddy Mobylml
 
P R A C T I C A2
P R A C T I C A2P R A C T I C A2
P R A C T I C A2
climancc
 

Semelhante a Factory method (20)

Patrones de diseño.pptx
Patrones de diseño.pptxPatrones de diseño.pptx
Patrones de diseño.pptx
 
Java::Acceso a Bases de Datos
Java::Acceso a Bases de DatosJava::Acceso a Bases de Datos
Java::Acceso a Bases de Datos
 
Programa Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosPrograma Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viveros
 
Patrones Con C#
Patrones Con C#Patrones Con C#
Patrones Con C#
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUG
 
Sebastian
SebastianSebastian
Sebastian
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Primera App - Laboratorio Android
Primera App - Laboratorio AndroidPrimera App - Laboratorio Android
Primera App - Laboratorio Android
 
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
 
Cuadrado y cubo de un numero
Cuadrado y cubo de un numeroCuadrado y cubo de un numero
Cuadrado y cubo de un numero
 
ing de sistemas
ing de sistemasing de sistemas
ing de sistemas
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggers
 
Prac1
Prac1Prac1
Prac1
 
P2C2 Introducción a JEE5
P2C2 Introducción a JEE5P2C2 Introducción a JEE5
P2C2 Introducción a JEE5
 
Tips componentes swing_v5
Tips componentes swing_v5Tips componentes swing_v5
Tips componentes swing_v5
 
SCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner ClassesSCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner Classes
 
Informe tecnico unidad 2
Informe tecnico unidad 2Informe tecnico unidad 2
Informe tecnico unidad 2
 
Informetecnicou2 topicos
Informetecnicou2 topicosInformetecnicou2 topicos
Informetecnicou2 topicos
 
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
 
P R A C T I C A2
P R A C T I C A2P R A C T I C A2
P R A C T I C A2
 

Último

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Último (11)

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 

Factory method

  • 1. Factory Method Autentia - Buen Diseño
  • 2. Intención “Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method let a class defer instantiation to subclasses.” Gamma et. al
  • 4. ¿Cuándo usarlo? ● Abstraer a la clase cliente sobre qué clase concreta de una familia tiene que usar. ● Delegar la decisión de qué clases se van a instanciar en las clases hijas. ● Desacoplar la complejidad de la instanciación. ● Como alternativa a los constructores (Static FM). ● Para hacer más extensible la arquitectura.
  • 5. Pero no debemos usarlo siempre Como todos los patrones: no se debe forzar su uso si no es necesario. ● Necesitamos una familia de objetos sobre los que trabajar ● Puede aumentar la complejidad de la aplicación introduciendo más niveles de indirección. ● No caer en la tentación de aplicarlo por si en el futuro es necesario.
  • 6. Tipos de Implementación En general hay 4 tipos de implementación 1. Factoría padre abstracta que delega siempre en las Factorías hijas. 2. Factoría padre que devuelve valor por defecto y casos especiales en Factorías Hijas. 3. Factoría padre con tipo por parámetro. Y también: 4. Variante: Static Factory Method.
  • 7. Ejemplo Familia de productos “Pelota” para diferentes deportes. public abstract class Pelota { float diametro; float peso; String material; public abstract String getTipo(); //Getters y Setters... } public class BaloncestoPelota extends Pelota { public String getTipo() { return "pelota de Baloncesto"; } } public class FutbolPelota extends Pelota { public String getTipo() { return "una pelota de fútbol"; } } public class TenisPelota extends Pelota { public String getTipo() { return "pelota de tenis"; } } public class GenericaPelota extends Pelota { public String getTipo() { return "pelota genérica"; } }
  • 8. Ejemplo Deportistas a los que asignar una pelota para su deporte. public class Deportista { String nombre; Pelota pelota; public Deportista(String nombre) { this.nombre = nombre; } public String getSaludo() { return "Hola, soy " + getNombre() + " y juego con una pelota de " + getPelota().getTipo() + " que pesa " + getPelota().getPeso() + " gramos"; } //Getters y Setters... }
  • 9. Ejemplo Familia de fábricas que construyen productos pelota concreta en cada método (tipo 1) public interface FactoryPelotas { public Pelota create(); } public class FactoryBaloncestoPelotas implements FactoryPelotas { public Pelota create() { return new BaloncestoPelota(); } } public class FactoryFutbolPelotas implements FactoryPelotas { public Pelota create() { return new FutbolPelota(); } } public class FactoryTenisPelotas implements FactoryPelotas { public Pelota create() { return new TenisPelota(); } }
  • 10. Ejemplo Main (Cliente que usa productos) public class main { public static void main(String[] args) { ArrayList<Deportista> deportistas = new ArrayList<Deportista>(); // Definición de deportistas Deportista baloncestoDep = new Deportista("Gasol"); Deportista futbolDep = new Deportista("Messi"); Deportista tenisDep = new Deportista("Nadal"); // Fábricas concretas baloncestoDep.setPelota(new FactoryBaloncestoPelotas().create()); futbolDep.setPelota(new FactoryFutbolPelotas().create()); tenisDep.setPelota(new FactoryTenisPelotas().create()); deportistas.add(baloncestoDep); deportistas.add(futbolDep); deportistas.add(tenisDep); for (Deportista dep : deportistas) { dep.getPelota().setPeso((float) Math.random() * 500); System.out.println( dep.getSaludo()); }} }
  • 11. Factory con parámetro (tipo 3) public class FactoryParamPelotas { public static Pelota create(TipoPelota tipo) { Pelota salida; switch (tipo) { case BALONCESTO: salida = new BaloncestoPelota(); break; case TENIS: salida = new TenisPelota(); break; case FUTBOL: salida = new FutbolPelota(); break; default: salida = new GenericaPelota(); break; } return salida; } } …… baloncestoDep.setPelota( FactoryParamPelotas.create(TipoPelota.BALONCESTO)); baloncestoDep.setPelota( FactoryParamPelotas.create(TipoPelota.FUTBOL)); baloncestoDep.setPelota( FactoryParamPelotas.create(TipoPelota.TENIS));
  • 12. Static Factory Method Método estático que sustituye al constructor Foo x = new Foo(); vs. Foo x = Foo.create(); ...o usando parámetros en la superclase Foo x = Foo.create(tipo1); también mejora la legibilidad del código Punto punto = new Punto(x,y, sistemaMedicion); si lo cambiamos por Punto punto = Punto.createByMetros(x,y); Punto punto2 = Punto.createByInches(x,y);
  • 13. Relación con Abstract Factory AF es un nivel superior de abstracción