ABAP 디자인 모델 의 --- "단순 공장 모델 (Simple Factory Pattern)"

1. 정의 
하나의 단독 공장 류 (factory class) 로 실례 화 과정 을 제어 합 니 다.
2. 해독
비교:
  • 간단 한 공장 모델 은 현실 세계 의 공장 과 유사 하 다. 즉, 공장 은 고객 의 수요 에 따라 해당 하 는 제품 을 생 성 하 는 것 이다.
  • 프로그램 에서 간단 한 공장 모델 은 client 의 수요 에 따라 해당 하 는 인 스 턴 스
  • 를 되 돌려 줍 니 다.
    해석:
  • 류 의 기능 과 류 의 실례 화 과정 분리
  • 생산 클래스 (production class) 의 기능 정보 숨 기기
  • 공장 류 는 실례 화 과정의 유연성 을 향상 시킨다 (서로 다른 장면, 서로 다른 실례 를 되 돌려 준다, 동적 실례 를 되 돌려 준다)
  • 공장 류 의 도입 은 호출 자 와 서비스 제공 자 를 격 리 시 켰 고 서비스 조정 시 호출 자 는 변경 할 필요 가 없다
  • .
  • 공장 류 는 테스트 격 리 (Test Isolation, Test Double) 의 실현 경로
  • 이다.
    결합 응용:
  • 간단 한 공장 모델 은 전략 모델 과 자주 결합 하여 사용한다
  • 3. 예시
    3.1 Factory 는 유형 에 따라 인 스 턴 스 를 되 돌려 줍 니 다.
    이미 알 고 있 는 서로 다른 장면 에 대해 공장 류 를 이용 하여 서로 다른 장면 에서 대응 하 는 실례 를 되 돌 릴 수 있다.
    REPORT zsimple_factory_pattern.
    **********************************************************************
    * A generic interface
    **********************************************************************
    INTERFACE lif_generic_interface.
      METHODS:
        method_1,
        method_2.
    ENDINTERFACE.
    
    CLASS lcl_factory DEFINITION DEFERRED.
    **********************************************************************
    * Specific class A to implement this interface
    * 1) Production class shall be CREATE PRIVATE
    * 2) Factory is the friend of production class
    * 3) Factory is the only place to get the instance of production class
    **********************************************************************
    CLASS lcl_class_a DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_factory.
      PUBLIC SECTION.
        INTERFACES: lif_generic_interface.
    ENDCLASS.
    
    CLASS lcl_class_a IMPLEMENTATION.
      METHOD lif_generic_interface~method_1.
    
      ENDMETHOD.
    
      METHOD lif_generic_interface~method_2.
    
      ENDMETHOD.
    ENDCLASS.
    **********************************************************************
    * Specific class B to implement this interface
    **********************************************************************
    CLASS lcl_class_b DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_factory.
      PUBLIC SECTION.
        INTERFACES: lif_generic_interface.
    ENDCLASS.
    
    CLASS lcl_class_b IMPLEMENTATION.
      METHOD lif_generic_interface~method_1.
    
      ENDMETHOD.
    
      METHOD lif_generic_interface~method_2.
    
      ENDMETHOD.
    ENDCLASS.
    **********************************************************************
    * Factory class to control the instantiation
    **********************************************************************
    CLASS lcl_factory DEFINITION FINAL ABSTRACT.
      PUBLIC SECTION.
        " create per existing type
        CLASS-METHODS create
          IMPORTING
            iv_type            TYPE c
          RETURNING
            VALUE(ro_instance) TYPE REF TO lif_generic_interface.
    ENDCLASS.
    
    CLASS lcl_factory IMPLEMENTATION.
      METHOD create.
        CASE iv_type.
          WHEN 'A'.
            ro_instance = NEW lcl_class_a(  ).
          WHEN 'B'.
            ro_instance = NEW lcl_class_b(  ).
          WHEN OTHERS.
            ASSERT 1 = 2.
        ENDCASE.
      ENDMETHOD.
    ENDCLASS.
    
    START-OF-SELECTION.

    3.2 Factory 동적 반환 인 스 턴 스
    이런 모델 은 구조 적 인 디자인 에 더욱 적합 하 다.구조 에서 같은 인 터 페 이 스 를 실현 하 는 유형 을 계속 증가 하고 서로 다른 장면 에서 이들 을 예화 할 수 있다.
    **********************************************************************
    * Factory class to control the instantiation
    **********************************************************************
    CLASS lcl_factory DEFINITION FINAL ABSTRACT.
      PUBLIC SECTION.
        " if there are multiple class to be implemented by scenario
        " a dedicated customizing table could be defined
        " the type of instantiation can be determined dynamically
        CLASS-METHODS create_from_db
          IMPORTING
            iv_type            TYPE c
          RETURNING
            VALUE(ro_instance) TYPE REF TO lif_generic_interface.
    ENDCLASS.
    
    CLASS lcl_factory IMPLEMENTATION.
      METHOD create_from_db.
        DATA:
          lv_classname         TYPE seoclname.
    
        " layout of table ZFACTORYSIMPLE (client independent)
        "    Field   Key   Data Element
        "    TYPE    X     CHAR01
        "    CLASS   _     SEOCLNAME
    *    SELECT SINGLE class FROM zfactorysimple
    *                        INTO lv_classname
    *                       WHERE type = iv_type.
        IF sy-subrc = 0.
          CREATE OBJECT ro_instance TYPE (lv_classname).
        ELSE.
          " in case getting no concrete class is not a valid situation, make sure
          " implementation is complete (table entry is existing)
          ASSERT 1 = 2.
        ENDIF.
      ENDMETHOD.
    ENDCLASS.

    본 블 로 그 는 기술 공유 에 전념 하여 건어물 이 가득 차 서 지속 적 으로 업데이트 합 니 다.주목 을 환영 합 니 다.❤️、좋아요, 리 트 윗!

    좋은 웹페이지 즐겨찾기