Factory Method
Factory method
Factory Method es un patrón de diseño creacional que proporciona una interfaz para crear objetos en una superclase, mientras permite a las subclases alterar el tipo de objetos que se crearán.
Problema
Imaginemos el siguiente problema, tenemos varios tipos de pagos disponibles, nosotros desde la parte del cliente, no queremos mostrar como funciona por detrás el sistema de pagos. El cliente lo único que verá es que se crea un tipo de pago u otro dependiendo del tipo de pago que le proporcionemos. Por otro lado vamos a tener una clase Factory que será la encargada de proporcionar objetos de un tipo y otro.
public static void main(String[] args) {
PaymentFactory factory = PaymentFactory.getInstance();
Payment cash = factory.getPaymentMethod(PaymentType.CASH);
cash.doPayment(22.5);
Payment card = factory.getPaymentMethod(PaymentType.CREDIT_CARD);
card.doPayment(10.7);
}
La clase factory su función es crear objetos de un tipo y otro.
public class PaymentFactory {
private static PaymentFactory instance;
private PaymentFactory(){}
public static PaymentFactory getInstance(){
if(instance == null){
instance = new PaymentFactory();
}
return instance;
}
public Payment getPaymentMethod(PaymentType paymentType) {
switch (paymentType) {
case CASH:
return new Cash();
case CREDIT_CARD:
return new CreditCard();
default:
return null;
}
}
La clase factory podría ser singleton para que siempre fuera la misma instancia se llame desde varios sitios.
Por otro lado si los sistemas de pago tienen que ser únicos en toda la aplicación a lo mejor también tendrían que ser singleton estas clases.
Como vamos a tener varios sistemas de pago, vamos a definir una interfaz con los métodos que necesitamos que cada implementación tenga.
public interface Payment {
void doPayment(double money);
}
En este caso es una interfaz sencilla que solamente va a tener un método que es, el de efectuar el pago.
Luego necesitamos las implementaciones para esta interfaz. En este ejemplo vamos a tener dos muy sencillas, pago con tarjeta de crédito o en cash. Aquí se muestran las implementaciones.
public class Cash implements Payment {
@Override
public void doPayment(double money) {
System.out.printf("Paid with cash: %.2f\n", money);
}
}
public class CreditCard implements Payment{
@Override
public void doPayment(double money) {
System.out.printf("Paid with credit card: %.2f\n", money);
}
}