ABAP设计模式之---“单例模式(Singleton Pattern)”

1. 定义

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2. 解读

类比:

  • 单例模式的主要目的是控制类的实例数量,确保有且仅有一个实例,有点像“类的计划生育”,O(∩_∩)O哈哈~

解析:

  • 使用单例模式,要加深一些基本概念的理解,也即类的构造方法、可视区域、静态方法、静态成员变量几个概念
  • 通过对于构造方法的控制,可以控制类的实例化范围;静态成员变量的使用,可以控制实例的数量;静态方法,则提供了类实例化的唯一访问点
  • 单例模式可与工厂模式结合使用,将工厂类定义为生产类的Friends, 工厂类中提供类的唯一实例化位置
  • 单例模式中,通常依据不同的编程语言,还会细分为“饿汉式单例”和“懒汉式单例”。 “饿汉式单例”也即在静态初始化类的时候,便完成自身的实例化。“懒汉式单例”要在第一个被访问时,才将自己实例化。在ABAP语言中,也有着类似的概念,在实例代码中给出了相关的例子。
  • 对于多线程时的单例,要考虑锁的问题,这个特性依据不同的编程语言而定。其目的,也即确保实例的唯一性。

要点:

  1. 类的定义选择CREATE PRIVATE,也即,仅可自己实例化自身
  2. 定义静态成员变量 CLASS-DATA go_instance, 保存唯一的实例
  3. 定义静态方法CLASS-METHODS Get_Instance, 唯一获取实例的位置
  4. ABAP开发过程中,为了在同一线程中的不同的模块间集成,经常会使用到单例模式(单例模式中的静态实例变量,某种程度上,完成了全局变量的功能)

3. 举例

控制关键字NEW的作用范围,尽可以在本类中完成对自己的实例化。
在这里插入图片描述

3.1 在访问时实例化(懒汉式单例)

* 1) Create private
* 2) static attribute go_instance
* 3) Get_Instance() is the only place to obtain an instance
**********************************************************************
* Lazy Instantiation
**********************************************************************
CLASS lcl_singleton_a DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS get_instance
      RETURNING
        VALUE(ro_instance) TYPE REF TO lcl_singleton_a.
  PRIVATE SECTION.
    CLASS-DATA go_instance TYPE REF TO lcl_singleton_a.
ENDCLASS.

CLASS lcl_singleton_a IMPLEMENTATION.
  METHOD get_instance.
    IF go_instance IS NOT BOUND.
      go_instance = NEW lcl_singleton_a( ).
    ENDIF.
    ro_instance = go_instance.
  ENDMETHOD.
ENDCLASS.
**********************************************************************
START-OF-SELECTION.
  DATA(lo_object_a) = lcl_singleton_a=>get_instance( ).

3.2 在加载时实例化(饿汉式单例)

**********************************************************************
* Instantiation at class loading time
**********************************************************************
CLASS lcl_singleton_b DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS class_constructor.
    CLASS-METHODS get_instance
      RETURNING
        VALUE(ro_instance) TYPE REF TO lcl_singleton_b.

  PRIVATE SECTION.
    CLASS-DATA go_instance TYPE REF TO lcl_singleton_b.
ENDCLASS.

CLASS lcl_singleton_b IMPLEMENTATION.
  METHOD get_instance.
    ro_instance = go_instance.
  ENDMETHOD.

  METHOD class_constructor.
    IF go_instance IS NOT BOUND.
      go_instance = NEW lcl_singleton_b( ).
    ENDIF.
  ENDMETHOD.
ENDCLASS.
**********************************************************************
START-OF-SELECTION.
  DATA(lo_object_b) = lcl_singleton_b=>get_instance( ).

以上是对ABAP中单例模式的总结,欢迎分享、留言。😉

本博客专注于技术分享,干货满满,持续更新。
欢迎关注❤️、点赞👍、转发📣!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十年铸器

给作者赏杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值