Main Class Code

CLASS zcl_spfli_buffer DEFINITION
  PUBLIC
  CREATE PRIVATE.

  PUBLIC SECTION.
    CLASS-METHODS:
      get_instance
        RETURNING
          VALUE(ro_instance) TYPE REF TO zcl_spfli_buffer.
    METHODS:
      get_spfli_data
        IMPORTING
          iv_connid     TYPE s_conn_id
        RETURNING
          VALUE(rt_spfli) TYPE TABLE OF spfli.

  PRIVATE SECTION.
    CLASS-DATA: gt_spfli_buffer TYPE TABLE OF spfli WITH EMPTY KEY,
                go_instance TYPE REF TO zcl_spfli_buffer.
    METHODS:
      load_buffer.
ENDCLASS.

CLASS zcl_spfli_buffer IMPLEMENTATION.

  METHOD get_instance.
    " Create the singleton instance if it doesn't already exist
    IF go_instance IS NOT BOUND.
      CREATE OBJECT go_instance.
    ENDIF.
    ro_instance = go_instance.
  ENDMETHOD.

  METHOD get_spfli_data.
    " Load buffer if empty
    IF gt_spfli_buffer IS INITIAL.
      load_buffer( ).
    ENDIF.

    " Use FILTER operator for better performance to read from the buffer
    rt_spfli = FILTER #( gt_spfli_buffer USING KEY primary_key
                                     WHERE connid = iv_connid ).
  ENDMETHOD.

  METHOD load_buffer.
    " Load data from database to buffer
    SELECT * FROM spfli INTO TABLE gt_spfli_buffer.
  ENDMETHOD.

ENDCLASS.

And in User-Exit, BADI

DATA: lo_spfli_buffer TYPE REF TO zcl_spfli_buffer,
      lt_spfli        TYPE TABLE OF spfli.

" Get the singleton instance of the zcl_spfli_buffer class
lo_spfli_buffer = zcl_spfli_buffer=>get_instance( ).

" Call the get_spfli_data method
lt_spfli = lo_spfli_buffer->get_spfli_data(
              iv_connid = 'Your_Connection_ID' ).

" You can now process lt_spfli as needed within your exit
LOOP AT lt_spfli INTO DATA(ls_spfli).
  " Implement your logic with ls_spfli
ENDLOOP.