CLASS lcl_singleton DEFINITION CREATE PRIVATE. " 禁止外部实例化
PUBLIC SECTION. CLASS-METHODS: get_instance RETURNING VALUE(ro_instance) TYPE REF TO lcl_singleton. METHODS: do_something.
PRIVATE SECTION. CLASS-DATA: mo_instance TYPE REF TO lcl_singleton. METHODS: constructor.
ENDCLASS.
CLASS lcl_singleton IMPLEMENTATION. METHOD get_instance. IF mo_instance IS NOT BOUND. mo_instance = NEW lcl_singleton( ). ENDIF. ro_instance = mo_instance. ENDMETHOD.
" 具体产品 CLASS lcl_pdf_doc DEFINITION. PUBLIC SECTION. INTERFACES lif_document. ENDCLASS.
CLASS lcl_word_doc DEFINITION. PUBLIC SECTION. INTERFACES lif_document. ENDCLASS.
" 工厂类 CLASS lcl_doc_factory DEFINITION. PUBLIC SECTION. CLASS-METHODS: create_document IMPORTING iv_type TYPE string RETURNING VALUE(ro_doc) TYPE REF TO lif_document. ENDCLASS.
CLASS lcl_doc_factory IMPLEMENTATION. METHOD create_document. CASE iv_type. WHEN 'PDF'. ro_doc = NEW lcl_pdf_doc( ). WHEN 'WORD'. ro_doc = NEW lcl_word_doc( ). WHEN OTHERS. " 可抛出异常 ENDCASE. ENDMETHOD. ENDCLASS.
CLASS lcl_order DEFINITION. PUBLIC SECTION. METHODS: " 导航方法:从订单导航到客户 get_customer RETURNING VALUE(ro_customer) TYPE REF TO lcl_customer, " 导航方法:从订单导航到订单行项目 get_items RETURNING VALUE(rt_items) TYPE lcl_item=>tt_items, " 导航方法:根据索引获取特定行项目 get_item IMPORTING iv_index TYPE i RETURNING VALUE(ro_item) TYPE REF TO lcl_item. PRIVATE SECTION. DATA: mo_customer TYPE REF TO lcl_customer, mt_items TYPE STANDARD TABLE OF REF TO lcl_item. ENDCLASS.
" ---- 抽象日志写入器 ---- CLASS lcl_log_writer DEFINITION ABSTRACT. PUBLIC SECTION. METHODS: write_log ABSTRACT IMPORTING iv_message TYPE string iv_level TYPE char1. METHODS: get_type ABSTRACT RETURNING VALUE(rv_type) TYPE string. ENDCLASS.
" ---- 文件写入器 ---- CLASS lcl_file_writer DEFINITION INHERITING FROM lcl_log_writer. PUBLIC SECTION. METHODS: write_log REDEFINITION, get_type REDEFINITION. ENDCLASS. CLASS lcl_file_writer IMPLEMENTATION. METHOD write_log. " 写入文件的实现 WRITE: / '[FILE]', iv_level, iv_message. ENDMETHOD. METHOD get_type. rv_type = 'FILE'. ENDMETHOD. ENDCLASS.
" ---- 数据库写入器 ---- CLASS lcl_db_writer DEFINITION INHERITING FROM lcl_log_writer. PUBLIC SECTION. METHODS: write_log REDEFINITION, get_type REDEFINITION. ENDCLASS. CLASS lcl_db_writer IMPLEMENTATION. METHOD write_log. " 写入数据库的实现 WRITE: / '[DB]', iv_level, iv_message. ENDMETHOD. METHOD get_type. rv_type = 'DB'. ENDMETHOD. ENDCLASS.
" ---- 工厂 ---- CLASS lcl_writer_factory DEFINITION. PUBLIC SECTION. CLASS-METHODS: create IMPORTING iv_type TYPE string RETURNING VALUE(ro_writer) TYPE REF TO lcl_log_writer. ENDCLASS. CLASS lcl_writer_factory IMPLEMENTATION. METHOD create. CASE iv_type. WHEN 'FILE'. ro_writer = NEW lcl_file_writer( ). WHEN 'DB'. ro_writer = NEW lcl_db_writer( ). ENDCASE. ENDMETHOD. ENDCLASS.
" ---- 单例日志管理器 ---- CLASS lcl_log_manager DEFINITION CREATE PRIVATE. PUBLIC SECTION. CLASS-METHODS: get_instance RETURNING VALUE(ro_mgr) TYPE REF TO lcl_log_manager. METHODS: log IMPORTING iv_message TYPE string iv_level TYPE char1 DEFAULT 'I'. PRIVATE SECTION. CLASS-DATA: mo_instance TYPE REF TO lcl_log_manager. DATA: mo_writer TYPE REF TO lcl_log_writer. METHODS: constructor. ENDCLASS. CLASS lcl_log_manager IMPLEMENTATION. METHOD get_instance. IF mo_instance IS NOT BOUND. mo_instance = NEW lcl_log_manager( ). ENDIF. ro_mgr = mo_instance. ENDMETHOD. METHOD constructor. mo_writer = lcl_writer_factory=>create( 'FILE' ). ENDMETHOD. METHOD log. mo_writer->write_log( iv_message = iv_message iv_level = iv_level ). ENDMETHOD. ENDCLASS.