What is the concept of the Singleton design pattern?
The concept of restricting the instantiation of the class toonly and only to one object is called Singleton. As name suggests, it willrestrict to create only one instance of a class. The class will have logic inplace which will deny if the application will ask for more than one instance.
Let’s try to understand with following examples:
- We have an application which will bring the pay stub of an employee for current month. In a standard system, there will be only one active salary account forthe employee with the company. Because of this fact, we should only create oneobject of the employee’s salary account. In program, we are creating this object in a loop. So, what happens if we don’t have a design pattern which willrestrict it for creating more than one instance of that object? Application will create; rather overwrite an instance of the class.
- In WebDynpro ABAP when you want to enhance SAP standard components wherein a child component wants to share data with the parent component. You can’t add an interface node, not any interface method ina WebDynpro Enhancement component controller. Check the official announcementfrom SAP: SAP note 1476699.
So only way to share data between standard WebDynpro components is a singleton class.
This is how you would create a singleton class:
1. Createa class in SE24 which has instantiation property as private, this would create a constructor which is private.
2. Since constructor is private, to instantiate the class, we will need to create a Public Static method. In this public static method we will instantiate the class. To do this we will create an attribute of the type singleton class and store the reference in this attribute.
3. Code snippet for the public static method is
IF gref_obj IS not BOUND.
CREATE OBJECT gref_obj TYPE zash_singleton_test.
ref_obj = gref_obj.
4. Now create an attribute at instance level of type Public which will be used to store the value to be shared.
5. Now create an instance of the class in Child component and set the values to beshared in WDDOINIT of a child Componentcontroller
DATA: lo_obj TYPE REF TO zash_singleton_test.
lo_obj ?= zash_singleton_test=>get_instance( ).
‘This value will be printed from calling Component ‘.
6. Read this value from parent component’s WDDOINIT of Componentcontroller
DATA lo_cmp_usage TYPE REF TO if_wd_component_usage.
lo_cmp_usage = wd_this->wd_cpuse_z_sub_comp( ).
IF lo_cmp_usage->has_active_component( ) IS INITIAL.
DATA: lo_obj1 TYPE REF TO zash_singleton_test.
DATA z_retrieved_value TYPE string.
lo_obj1 ?= zash_singleton_test=>get_instance( ).
IF lo_obj1 IS BOUND.
z_retrieved_value = lo_obj1->a_test_string.
Now this pattern can be used in Custom developed WebDynproABAP Components as well to share data between parent and child components this is light weight data sharing approach.
This approach also better allows UIBBs (User InterfaceBuilding Blocks) implemented via feeder classes to be integrated with WDComponents within the Floorplan Manager.