Задаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа.
Проще говоря, это паттерн создания объекта через клонирование другого объекта вместо создания через конструктор.
Используйте этот шаблон проектирования, когда система не должна зависеть от того, как в ней создаются, компонуются и представляются продукты:
- инстанцируемые классы определяются во время выполнения, например с помощью динамической загрузки;
- для того чтобы избежать построения иерархий классов или фабрик, параллельных иерархии классов продуктов;
- экземпляры класса могут находиться в одном из нескольких различных состояний. Может оказаться удобнее установить соответствующее число прототипов и клонировать их, а не инстанцировать каждый раз класс вручную в подходящем состоянии.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
PROGRAM zlr_prototype. CLASS lcl_report_data DEFINITION ABSTRACT. PUBLIC SECTION. METHODS: clone ABSTRACT RETURNING VALUE(ro_object) TYPE REF TO lcl_report_data. METHODS: select_data ABSTRACT. ENDCLASS. CLASS lcl_detail_report_data DEFINITION INHERITING FROM lcl_report_data. PUBLIC SECTION. METHODS: clone REDEFINITION. METHODS: select_data REDEFINITION. DATA: t_data TYPE STANDARD TABLE OF t100. ENDCLASS. CLASS lcl_detail_report_data IMPLEMENTATION. METHOD select_data. SELECT * FROM t100 INTO TABLE t_data UP TO 20 ROWS WHERE sprsl = sy-langu. ENDMETHOD. "select_Data METHOD clone. " Метод создает еще одну инстанцию объекта, " копируя все внутренние переменные DATA: lo_object TYPE REF TO lcl_detail_report_data. CREATE OBJECT lo_object. lo_object->t_data = me->t_data. ro_object = lo_object. ENDMETHOD. ENDCLASS. CLASS lcl_main DEFINITION. PUBLIC SECTION. CLASS-METHODS: run. ENDCLASS. CLASS lcl_main IMPLEMENTATION. METHOD run. DATA: lo_report TYPE REF TO lcl_report_data. CREATE OBJECT lo_report TYPE lcl_detail_report_data. lo_report->select_data( ). DATA: lo_rep_2 TYPE REF TO lcl_report_data. " Вместо инициации создания объекта и получения данных клонируем объект lo_rep_2 = lo_report->clone( ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. lcl_main=>run( ). |