REPORT  z_facade.
 

CLASS lcl_data_read DEFINITION.
  PUBLIC SECTION.
    METHODS: constructor.
ENDCLASS.                    
                    
CLASS lcl_write_alv DEFINITION.
  PUBLIC SECTION.
    methods: display_alv
ENDCLASS.                    


CLASS lcl_write_log DEFINITION.
  PUBLIC SECTION.
    methods: display_list
ENDCLASS.                    

CLASS lcl_facade DEFINITION.
  PUBLIC SECTION.
    METHODS: process_report IMPORTING iv_report_type TYPE char1.
ENDCLASS.                   


CLASS lcl_data IMPLEMENTATION.
  METHOD constructor.
    WRITE: / 'Get Data'.
  ENDMETHOD.                    
ENDCLASS.                    

CLASS lcl_write_alv IMPLEMENTATION.
  METHOD display.
    WRITE: / 'Writing data in ALV'.
  ENDMETHOD.                    
ENDCLASS.                    

CLASS lcl_write_list IMPLEMENTATION.
  METHOD display.
    WRITE: / 'writing data in list'.
  ENDMETHOD.                    
ENDCLASS.                    

CLASS lcl_facade IMPLEMENTATION.
  METHOD process_report.
    DATA: lo_data TYPE REF TO lcl_data.
    CREATE OBJECT lo_data.
 
    DATA: lo_write_alv TYPE REF TO lcl_write_alv.
    DATA: lo_write_list TYPE REF TO lcl_write_list.

    IF iv_write_type = 'A'.
      CREATE OBJECT lo_write TYPE lcl_write_alv.
    ELSE.
      CREATE OBJECT lo_write TYPE lcl_write_list.
    ENDIF.
    lo_write->display( ).
  ENDMETHOD.                    
ENDCLASS.                    
 
START-OF-SELECTION.
  DATA: lo_facade TYPE REF TO lcl_facade.
  CREATE OBJECT lo_facade.
  lo_facade->process_report( iv_write_type = 'A' ).