Low Level Design (LLD) Coding

Low Level Design (LLD) Coding

Design (LLD) a ATM machine - Machine Coding

Design (LLD) a ATM machine - Machine Coding's photo
·Feb 20, 2022·

3 min read

Subscribe to my newsletter and never miss my upcoming articles

Play this article

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 by becoming a sponsor. Any amount is appreciated!

See recent sponsors Learn more about Hashnode Sponsors
Share this