1. 定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2. 解读
类比:
- 单例模式的主要目的是控制类的实例数量,确保有且仅有一个实例,有点像“类的计划生育”,O(∩_∩)O哈哈~
解析:
- 使用单例模式,要加深一些基本概念的理解,也即类的构造方法、可视区域、静态方法、静态成员变量几个概念
- 通过对于构造方法的控制,可以控制类的实例化范围;静态成员变量的使用,可以控制实例的数量;静态方法,则提供了类实例化的唯一访问点
- 单例模式可与工厂模式结合使用,将工厂类定义为生产类的Friends, 工厂类中提供类的唯一实例化位置
- 单例模式中,通常依据不同的编程语言,还会细分为“饿汉式单例”和“懒汉式单例”。 “饿汉式单例”也即在静态初始化类的时候,便完成自身的实例化。“懒汉式单例”要在第一个被访问时,才将自己实例化。在ABAP语言中,也有着类似的概念,在实例代码中给出了相关的例子。
- 对于多线程时的单例,要考虑锁的问题,这个特性依据不同的编程语言而定。其目的,也即确保实例的唯一性。
要点:
- 类的定义选择CREATE PRIVATE,也即,仅可自己实例化自身
- 定义静态成员变量 CLASS-DATA go_instance, 保存唯一的实例
- 定义静态方法CLASS-METHODS Get_Instance, 唯一获取实例的位置
- 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中单例模式的总结,欢迎分享、留言。😉
本博客专注于技术分享,干货满满,持续更新。
欢迎关注❤️、点赞👍、转发📣!