//Concrete Creator
public class CarFactory implements VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Car();
}
}
//Concrete Creator
public class MotorcycleFactory implements VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Motorcycle();
}
}
//Client
public class Client {
public static void main(String[] args) {
VehicleFactory[] factories = {
new CarFactory(),
new MotorcycleFactory()
};
for (VehicleFactory factory : factories) {
factory.deliverVehicle();
}
//Output
//Delivering the vehicle: Driving a car!
//Delivering the vehicle: Riding a motorcycle!
}
}
//Product
public interface Payment {
void processPayment(int amount);
}
//Concrete Product
public class CreditCardPayment implements Payment {
private final String creditCardNumber;
public CreditCardPayment(String creditCardNumber) {
this.creditCardNumber = creditCardNumber;
}
@Override
public void processPayment(int amount) {
System.out.printf("Credit card: $%d by [%s]\n", amount, creditCardNumber);
}
}
//Concrete Product
public class BankTransferPayment implements Payment {
private final String bankAccountNumber;
public BankTransferPayment(String bankAccountNumber) {
this.bankAccountNumber = bankAccountNumber;
}
@Override
public void processPayment(int amount) {
System.out.printf("Bank transfer: $%d by [%s]\n", amount, bankAccountNumber);
}
}
//Concrete Product
public class PayPalPayment implements Payment {
private final String payPalEmail;
public PayPalPayment(String payPalEmail) {
this.payPalEmail = payPalEmail;
}
@Override
public void processPayment(int amount) {
System.out.printf("PayPal: $%d by [%s]\n", amount, payPalEmail);
}
}
//Creator
public interface PaymentFactory {
Payment createPayment(FinancialInfo info);
}
//Concrete Creator
public class CreditCardPaymentFactory implements PaymentFactory {
@Override
public Payment createPayment(FinancialInfo info) {
return new CreditCardPayment(info.creditCardNumber);
}
}
//Concrete Creator
public class BankTransferPaymentFactory implements PaymentFactory {
@Override
public Payment createPayment(FinancialInfo info) {
return new BankTransferPayment(info.bankAccountNumber);
}
}
//Concrete Creator
public class PayPalPaymentFactory implements PaymentFactory {
@Override
public Payment createPayment(FinancialInfo info) {
return new PayPalPayment(info.payPalEmail);
}
}
public class FinancialInfo {
String creditCardNumber;
String payPalEmail;
String bankAccountNumber;
public FinancialInfo(String creditCardNumber, String payPalEmail, String bankAccountNumber) {
this.creditCardNumber = creditCardNumber;
this.payPalEmail = payPalEmail;
this.bankAccountNumber = bankAccountNumber;
}
}
//Client
public class Client {
public static void main(String[] args) {
FinancialInfo userInfo = new FinancialInfo(
"1234-5678-9012-3456",
"user@example.com",
"987654321"
);
for (Payment payment : payments) {
payment.processPayment(100);
}
PaymentFactory[] factories = {
new CreditCardPaymentFactory(),
new PayPalPaymentFactory(),
new BankTransferPaymentFactory()
};
for (EnumPaymentFactory factory : factories) {
Payment payment = factory.create(userInfo);
payment.processPayment(150);
}
//Output
//Credit card: $150 by [1234-5678-9012-3456]
//PayPal: $150 by [user@example.com]
//Bank transfer: $150 by [987654321]
}
}