? ABAP面向对象设计模式-单例模式(Singleton Design Pattern) - SAP顾问圈 亚博体育娱乐 ,亚博体育app怎么样,亚博2018网上投注
二维码

[面向对象] ABAP面向对象设计模式--单例模式(Singleton Design Pattern)

Twilight发表于 2018-01-16 16:32z3765295 最后回复于 2018-04-20 16:05 [复制链接] 1064 4

单例模式:基本概念是一个类只生成一个实例。


Singleton应用场景还是很多的,举个例子:一个公司中一个员工只能创建一个对象,薪资、基本资料等只能在一个对象中。


实现代码:
  1. CLASS lcl_employee DEFINITION CREATE PRIVATE.

  2. ??PUBLIC SECTION.
  3. ? ? CLASS-METHODS:get_employee_instance RETURNING VALUE(ro_employee) TYPE REF TO lcl_employee.

  4. ? ? METHODS:set_name IMPORTING iv_name TYPE char20,
  5. ? ?? ?? ?? ?get_name RETURNING VALUE(rv_name) TYPE char20.

  6. ??PRIVATE SECTION.
  7. ? ? CLASS-DATA:lo_employee TYPE REF TO lcl_employee.
  8. ? ? DATA:v_name TYPE char20.

  9. ENDCLASS.

  10. CLASS lcl_employee IMPLEMENTATION.
  11. ??METHOD: get_employee_instance.
  12. ? ? IF lo_employee IS INITIAL.
  13. ? ?? ?CREATE OBJECT lo_employee.
  14. ? ? ENDIF.
  15. ? ? ro_employee = lo_employee.
  16. ??ENDMETHOD.
  17. ??METHOD set_name.
  18. ? ? me->v_name = iv_name.
  19. ??ENDMETHOD.
  20. ??METHOD??get_name.
  21. ? ? rv_name = me->v_name.
  22. ??ENDMETHOD.

  23. ENDCLASS.

  24. START-OF-SELECTION.

  25. ??DATA: lo_emp TYPE REF TO lcl_employee.
  26. ??DATA: lv_result TYPE char20.

  27. ??WRITE:/ 'first employee'.
  28. ??lo_emp = lcl_employee=>get_employee_instance( ).
  29. ??lo_emp->set_name('Twilight.Liu').
  30. ??lv_result = lo_emp->get_name( ).
  31. ??WRITE:/ lv_result.

  32. ??CLEAR lv_result.
  33. ??SKIP 2.
  34. ??WRITE:/ 'seconds employee'.
  35. ??DATA: lo_emp_seconds TYPE REF TO lcl_employee.
  36. ??lo_emp_seconds = lcl_employee=>get_employee_instance( ).
  37. ??lv_result = lo_emp_seconds->get_name( ).
  38. ??WRITE:/ lv_result.
复制代码
执行结果:

CREATE PRIVATE 表示:只能在类本身方法或其友元的方法中实例化。这尤其意味着它不能作为子类的继承组件实例化。
Kd330
发表于 2018-1-17 14:31:10
新人,还没学到类
z3765295
发表于 2018-4-18 11:43:14
私有属性和保护不能被继承,但是这还是没有体现出这和题目以及文章有任何关系。就是先Set,再Get,当然只能找到一条。你又没有存储。或者说多个用户的时候,如何保证整个Sap会共享这个功能。
Twilight
发表于 2018-4-18 21:48:54
z3765295 发表于 2018-4-18 11:43
私有属性和保护不能被继承,但是这还是没有体现出这和题目以及文章有任何关系。就是先Set,再Get,当然只能 ...

虽然定义了两个参考应用lo_emp、lo_emp_seconds,但都是指向同一个对象,没有生成多个对象
z3765295
发表于 2018-4-20 16:05:33
Twilight 发表于 2018-4-18 21:48
虽然定义了两个参考应用lo_emp、lo_emp_seconds,但都是指向同一个对象,没有生成多个对象
...

你要用一个工作区去解决这个东西,比你这还快呢,而且还是一个工作区。而且也是单例,不能被继承。哈哈

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 亚博体育娱乐