Design (LLD) a ATM machine - Machine Coding

Design (LLD) a ATM machine - Machine Coding

My project (2).png

ATM Machine

An automated teller machine (ATM) is an electronic telecommunications instrument that provides the clients of a financial institution with access to financial transactions in a public space without the need for a cashier or bank teller. ATMs are necessary as not all the bank branches are open every day of the week, and some customers may not be in a position to visit a bank each time they want to withdraw or deposit money.

System Requirements The main components of the ATM that will affect interactions between the ATM and its users are:

  1. Card reader: to read the users’ ATM cards.
  2. Keypad: to enter information into the ATM e.g. PIN. cards.
  3. Screen: to display messages to the users.
  4. Cash dispenser: for dispensing cash.
  5. Deposit slot: For users to deposit cash or checks.
  6. Printer: for printing receipts.
  7. Communication/Network Infrastructure: it is assumed that the ATM has a communication infrastructure to communicate with the bank upon any transaction or activity.


  1. Balance inquiry: To see the amount of funds in each account.
  2. Deposit cash: To deposit cash.
  3. Deposit check: To deposit checks.
  4. Withdraw cash: To withdraw money from their checking account.
  5. Transfer funds: To transfer funds to another account.

Final Code

public enum TransactionType {

public enum TransactionStatus {

public enum CustomerStatus {

public class Address {
  private String streetAddress;
  private String city;
  private String state;
  private String zipCode;
  private String country;
// For simplicity, we are not defining getter and setter functions. The reader can
// assume that all class attributes are private and accessed through their respective
// public getter method and modified only through their public setter function.

public class Customer {
  private String name;
  private String email;
  private String phone;
  private Address address;
  private CustomerStatus status;

  private Card card;
  private Account account;

  public boolean makeTransaction(Transaction transaction);
  public Address getBillingAddress();

public class Card {
  private String cardNumber;
  private String customerName;
  private Date cardExpiry;
  private int pin;

  public Address getBillingAddress();

public class Account {
  private int accountNumber;
  private double totalBalance;
  private double availableBalance;

  public double getAvailableBalance();

public class SavingAccount extends Account {
  private double withdrawLimit;

public class CheckingAccount extends Account {
  private String debitCardNumber;
public class Bank {
  private String name;
  private String bankCode;

  public String getBankCode();
  public boolean addATM();

public class ATM {
  private int atmID;
  private Address location;

  private CashDispenser cashDispenser;
  private Keypad keypad;
  private Screen screen;
  private Printer printer;
  private CheckDeposit checkDeposit;
  private CashDeposit cashDeposit;

  public boolean authenticateUser();
  public boolean makeTransaction(Customer customer, Transaction transaction);

public class CashDispenser {
  private int totalFiveDollarBills;
  private int totalTwentyDollarBills;

  public boolean dispenseCash(double amount);
  public boolean canDispenseCash();

public class Keypad {
  public String getInput();

public class Screen {
  public boolean showMessage(String message);
  public TransactionType getInput();

public class Printer {
  public boolean printReceipt(Transaction transaction);

public abstract class DepositSlot {
  private double totalAmount;
  public double getTotalAmount();

public class CheckDepositSlot extends DepositSlot {
  public double getCheckAmount();

public class CashDepositSlot extends DepositSlot {
  public double receiveDollarBill();
public abstract class Transaction {
  private int transactionId;
  private Date creationTime;
  private TransactionStatus status;
  public boolean makeTransation();

public class BalanceInquiry extends Transaction {
  private int accountId;
  public double getAccountId();

public abstract class Deposit extends Transaction {
  private double amount;
  public double getAmount();

public class CheckDeposit extends Deposit {
  private String checkNumber;
  private String bankCode;

  public String getCheckNumber();

public class CashDeposit extends Deposit {
  private double cashDepositLimit;

public class Withdraw extends Transaction {
  private double amount;
  public double getAmount();

public class Transfer extends Transaction {
  private int destinationAccountNumber;
  public int getDestinationAccount();

Did you find this article valuable?

Support Subhahu Jain by becoming a sponsor. Any amount is appreciated!