二维码

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

Twilight发表于 2018-01-16 16:32z3765295 最后回复于 2018-04-20 16:05 [复制链接] 3674 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.
复制代码
执行结果:
Singleton.jpg
CREATE PRIVATE 表示:只能在类本身方法或其友元的方法中实例化。这尤其意味着它不能作为子类的继承组件实例化。
回复

使用道具 举报

Kd330
新人,还没学到类
回复 支持 反对

使用道具 举报

z3765295
私有属性和保护不能被继承,但是这还是没有体现出这和题目以及文章有任何关系。就是先Set,再Get,当然只能找到一条。你又没有存储。或者说多个用户的时候,如何保证整个Sap会共享这个功能。
回复 支持 反对

使用道具 举报

Twilight
z3765295 发表于 2018-4-18 11:43
私有属性和保护不能被继承,但是这还是没有体现出这和题目以及文章有任何关系。就是先Set,再Get,当然只能 ...

虽然定义了两个参考应用lo_emp、lo_emp_seconds,但都是指向同一个对象,没有生成多个对象
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

快速回帖

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

快速回复 返回顶部 返回列表