diff --git a/design-patterns/pom.xml b/design-patterns/pom.xml
index c772522..b7bf343 100644
--- a/design-patterns/pom.xml
+++ b/design-patterns/pom.xml
@@ -13,5 +13,26 @@
21
UTF-8
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.33
+ runtime
+
+
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.36
+
+
+ org.slf4j
+ slf4j-simple
+ 1.7.36
+
+
\ No newline at end of file
diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/Card.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/Card.java
new file mode 100644
index 0000000..417b133
--- /dev/null
+++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/Card.java
@@ -0,0 +1,11 @@
+package org.prateek.PaymentServiceDb.Basics;
+
+public class Card {
+ String cardNo;
+ String userName;
+
+ public Card(String cardNo, String userName) {
+ this.cardNo = cardNo;
+ this.userName = userName;
+ }
+}
diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/CreditCard.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/CreditCard.java
new file mode 100644
index 0000000..d4bab29
--- /dev/null
+++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/CreditCard.java
@@ -0,0 +1,11 @@
+package org.prateek.PaymentServiceDb.Basics;
+
+public class CreditCard extends Card implements PaymentMethod {
+ public CreditCard(String cardNo, String name) {
+ super(cardNo, name);
+ }
+
+ public void pay() {
+ System.out.println("Making payment via Credit Card");
+ }
+}
diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/DebitCard.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/DebitCard.java
new file mode 100644
index 0000000..ac88c92
--- /dev/null
+++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/DebitCard.java
@@ -0,0 +1,12 @@
+package org.prateek.PaymentServiceDb.Basics;
+
+public class DebitCard extends Card implements PaymentMethod {
+ public DebitCard(String cardNo, String userName) {
+ super(cardNo, userName);
+ }
+
+ @Override
+ public void pay() {
+ System.out.println("Making payment via Debit Card");
+ }
+}
diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentMethod.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentMethod.java
new file mode 100644
index 0000000..6d1ead2
--- /dev/null
+++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentMethod.java
@@ -0,0 +1,5 @@
+package org.prateek.PaymentServiceDb.Basics;
+
+public interface PaymentMethod {
+ void pay();
+}
diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentService.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentService.java
new file mode 100644
index 0000000..9204e50
--- /dev/null
+++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentService.java
@@ -0,0 +1,107 @@
+package org.prateek.PaymentServiceDb.Basics;
+
+import java.sql.*;
+
+public class PaymentService {
+ private static PaymentService instance;
+ private Connection connection;
+
+ // Singleton Constructor
+ private PaymentService() {
+ try {
+ this.connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdatabase", "root", "AdminSandeep");
+ createTableIfNotExists();
+ } catch (Exception e) {
+ throw new RuntimeException("Database connection failed!", e);
+ }
+ }
+
+ public static synchronized PaymentService getInstance() {
+ if (instance == null) {
+ instance = new PaymentService();
+ }
+ return instance;
+ }
+
+ // Ensures Table Exists
+ private void createTableIfNotExists() {
+ try (Statement stmt = connection.createStatement()) {
+ String sql = "CREATE TABLE IF NOT EXISTS payment_methods (" +
+ "id INT AUTO_INCREMENT PRIMARY KEY, " +
+ "name VARCHAR(255) UNIQUE NOT NULL, " +
+ "type ENUM('CREDIT_CARD', 'DEBIT_CARD', 'UPI') NOT NULL, " +
+ "details TEXT NOT NULL)";
+ stmt.executeUpdate(sql);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Add Payment Method with ENUM
+ public void addPaymentMethod(String name, PaymentMethod pm) {
+ try {
+ PaymentType type;
+ String details;
+
+ if (pm instanceof CreditCard) {
+ type = PaymentType.CREDIT_CARD;
+ details = ((CreditCard) pm).cardNo;
+ } else if (pm instanceof DebitCard) {
+ type = PaymentType.DEBIT_CARD;
+ details = ((DebitCard) pm).cardNo;
+ } else if (pm instanceof UPI) {
+ type = PaymentType.UPI;
+ details = ((UPI) pm).upiId;
+ } else {
+ throw new IllegalArgumentException("Unknown Payment Method");
+ }
+
+ PreparedStatement stmt = connection.prepareStatement(
+ "INSERT INTO payment_methods (name, type, details) VALUES (?, ?, ?) " +
+ "ON DUPLICATE KEY UPDATE type=VALUES(type), details=VALUES(details)");
+
+ stmt.setString(1, name);
+ stmt.setString(2, type.name()); // Store ENUM as String
+ stmt.setString(3, details);
+ stmt.executeUpdate();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Retrieve and Make Payment
+ public void makePayment(String name) {
+ try {
+ PreparedStatement stmt = connection.prepareStatement(
+ "SELECT type, details FROM payment_methods WHERE name = ?");
+ stmt.setString(1, name);
+ ResultSet rs = stmt.executeQuery();
+
+ if (rs.next()) {
+ PaymentType type = PaymentType.valueOf(rs.getString("type")); // Convert DB String to Enum
+ String details = rs.getString("details");
+
+ PaymentMethod pm;
+ switch (type) {
+ case CREDIT_CARD:
+ pm = new CreditCard(details, name);
+ break;
+ case DEBIT_CARD:
+ pm = new DebitCard(details, name);
+ break;
+ case UPI:
+ pm = new UPI(details, name);
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown Payment Type");
+ }
+
+ pm.pay();
+ } else {
+ throw new IllegalArgumentException("Payment method not found: " + name);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentType.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentType.java
new file mode 100644
index 0000000..00c1305
--- /dev/null
+++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/PaymentType.java
@@ -0,0 +1,5 @@
+package org.prateek.PaymentServiceDb.Basics;
+
+public enum PaymentType {
+ CREDIT_CARD, DEBIT_CARD, UPI, WALLET;
+}
diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/UPI.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/UPI.java
new file mode 100644
index 0000000..f746c46
--- /dev/null
+++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Basics/UPI.java
@@ -0,0 +1,15 @@
+package org.prateek.PaymentServiceDb.Basics;
+
+public class UPI implements PaymentMethod {
+ String upiId;
+ String userName;
+
+ public UPI(String upiId, String userName) {
+ this.upiId = upiId;
+ this.userName = userName;
+ }
+
+ public void pay() {
+ System.out.println("Making payment via UPI" + upiId);
+ }
+}
diff --git a/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Client.java b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Client.java
new file mode 100644
index 0000000..6248d94
--- /dev/null
+++ b/design-patterns/src/main/java/org/prateek/PaymentServiceDb/Client.java
@@ -0,0 +1,26 @@
+package org.prateek.PaymentServiceDb;
+
+import org.prateek.PaymentServiceDb.Basics.CreditCard;
+import org.prateek.PaymentServiceDb.Basics.DebitCard;
+import org.prateek.PaymentServiceDb.Basics.PaymentService;
+import org.prateek.PaymentServiceDb.Basics.UPI;
+
+public class Client {
+ public static void main(String[] args) {
+ System.out.println("Hello, World!");
+ PaymentService ps = PaymentService.getInstance();
+
+ ps.addPaymentMethod("sandeepCreditCardId", new CreditCard("1234", "Sandeep"));
+ ps.addPaymentMethod("JohnCredit", new CreditCard("1234-5678-9876", "John"));
+ ps.addPaymentMethod("JohnUPI", new UPI("john@upi", "John"));
+ ps.makePayment("JohnCredit");
+
+ ps.makePayment("sandeepCreditCardId");
+ ps.addPaymentMethod("sgDebitCardId", new DebitCard("5678", "Sandeep"));
+ ps.makePayment("sgDebitCardId");
+ ps.addPaymentMethod("SgUPIID", new UPI("sg@okhdfcbank", "Sandeep"));
+ ps.makePayment("SgUPIID");
+
+ }
+}
+