Entdecken Sie eBooks
Kategorien
Entdecken Sie Hörbücher
Kategorien
Entdecken Sie Zeitschriften
Kategorien
Entdecken Sie Dokumente
Kategorien
Leseprobe
Um einheitliche Objekte für eine ABAP-Anwendung zu erzeugen,
können Sie standardisierte Entwurfsmuster einsetzen. In dieser Lese-
probe stellen Ihnen die Autoren die unterschiedlichen Möglichkeiten
vor, die sich durch Entwurfsmuster für die Erzeugung von Objekten
ergeben. Darüber hinaus umfasst diese Leseprobe neben Kapitel 3
des Buches das Inhaltsverzeichnis sowie den Index.
Kapitel 3: »Erzeugungsmuster«
Inhaltsverzeichnis
Index
Die Autoren
Leseprobe weiterempfehlen
www.sap-press.de/3881
Kapitel 3
3 Erzeugungsmuster
Wie bereits in Abschnitt 1.1.2, »Softwaredesign mithilfe von Ent- Klassen- und
wurfsmustern«, erläutert, unterscheiden wir bei Entwurfsmustern Objektmuster
Im Folgenden ordnen wir die in diesem Kapitel vorgestellten Muster Klassen- und
der Gruppe der Erzeugungsmuster diesen beiden Kategorien zu: objektbasierte
Erzeugungsmuster
왘 Klassenmuster
– Factory Pattern
Wie alle Erzeugungsmuster erzeugt das Factory Pattern neue
Objekte. Diese Objekte werden über Klassen anhand von
63
3 Erzeugungsmuster Erzeugungsmuster 3
Importparametern definiert. Bei diesen Klassen handelt es sich Änderungen an dem Objekt für alle Aufrufer gültig. Dieses Pat-
jeweils um Ableitungen einer abstrakten Klasse. Das Entwurfs- tern wird daher für den globalen Zugriff auf Instanzen verwen-
muster setzt dabei das Polymorphismus-Prinzip um. det.
– Abstract Factory Pattern In den folgenden Abschnitten erläutern wir die einzelnen Erzeu- Aufbau dieses
Das Abstract Factory Pattern basiert auf dem Factory Pattern. Im gungsmuster näher. Um Ihnen einen einfachen Überblick über die Kapitels
Falle des Abstract Factory Patterns ist die Factory-Klasse selbst Entwurfsmuster zu geben und die Vergleichbarkeit zu gewährleis-
eine abstrakte Klasse. Dies hat den Vorteil, dass die Factory- ten, sind die Abschnitte dabei jeweils nach der folgenden Struktur
Klasse noch flexibler und austauschbarer ist. Das Abstract Fac- gegliedert:
tory Pattern erzeugt keine konkreten Objekte, sondern kon-
1. Problem
krete Factory-Klassen. Dies bedeutet, eine abstrakte Factory-
Zu jedem Entwurfsmuster beschreiben wir zunächst die Situation,
Klasse ist eine Factory für die konkreten Factory-Klassen. Durch
in der es angewendet werden kann.
dieses Konzept lassen sich jederzeit neue Factory-Klassen inte-
grieren oder bestehende durch andere Factory-Klassen ersetzen. 2. Ansatz und Lösung
Im zweiten Schritt beschreiben wir den Lösungsansatz des jewei-
왘 Objektmuster
ligen Entwurfsmusters. Wir gehen anhand eines abstrakten Bei-
– Builder Pattern
spiels darauf ein, wie das Entwurfsmuster und dessen Komponen-
Beim Builder Pattern wird die Erzeugung komplexer Objekte
ten aufgebaut sind und wie diese in Beziehung zu anderen Klassen
von der eigentlichen Repräsentation getrennt. Dadurch können
stehen. Ziel dieser Beschreibungen ist es, die Muster in der Praxis
unterschiedliche Repräsentationen der Objekte erzeugt wer-
anwenden zu können.
den. Diese sind immer abhängig von den Anforderungen der
3. Einsatzbeispiele
jeweiligen Klassen bzw. von der Erzeugung. Dieses Entwurfs-
Im nächsten Schritt führen wir mögliche Einsatzgebiete für die
muster arbeitet mit unterschiedlichen Konstruktoren, die oft in
einzelnen Entwurfsmuster an.
Verbindung mit Kompositum-Entwurfsmustern verwendet
werden. Das Kompositum-Entwurfsmuster wird genutzt, um 4. Umsetzung in ABAP
Hierarchien aus Objekten aufzubauen, die zusammen als Teile In den Abschnitten »Umsetzung in ABAP« zeigen wir Ihnen, wie
eines Ganzen dienen. Dabei werden die Objekte zu Baumstruk- die Entwurfsmuster in ABAP realisiert werden können. Wir erläu-
turen zusammengesetzt. tern dabei jeweils, wie das Entwurfsmuster aufgebaut wird und
welche Funktionen die einzelnen Methoden haben. Die Imple-
– Prototype Pattern
mentierung der einzelnen Entwurfsmuster erfolgt jeweils in
Das Prototype Pattern wird zunächst mit einer vorläufigen In-
ABAP-Klassen, die wiederum verschiedene Unterklassen besitzen.
stanz eines komplexen Objekts initialisiert. Im weiteren Verlauf
Aus Gründen der Übersichtlichkeit erstellen wir in unseren Bei-
wird immer das ursprüngliche Objekt des Prototyps geklont
spielen alle Klassen über die Transaktion SE24, den Class Builder.
und kann unabhängig vom eigentlichen Objekt verwendet wer-
den. 5. Evaluation
Abschließend stellen wir jeweils die Vor- und Nachteile des
– Singleton Pattern
besprochenen Entwurfsansatzes einander gegenüber. Dadurch
Das Singleton Pattern wird mithilfe einer Klasse realisiert. Von
möchten wir Ihnen die Entscheidung erleichtern, welches Ent-
dieser Klasse kann nur ein Objekt instanziiert werden. Greifen
wurfsmuster Sie am besten in Ihren Anwendungen und für Ihren
Sie anschließend auf das Entwurfsmuster zu, erhalten Sie
konkreten Zweck verwenden können. Viele Entwurfsmuster wei-
immer das ursprünglich instanziierte Objekt. Da stets mit Refe-
sen problematische Seiteneffekte auf, die aber durch eine Kombi-
renzen auf diese einmalige Instanz gearbeitet wird, sind alle
nation mehrerer Entwurfsmuster minimiert werden können.
64 65
3 Erzeugungsmuster Builder Pattern 3.1
3.1.1 Problem
Beispiel: Das Builder Pattern wird verwendet, um den Erzeugungsprozess
verschiedene komplexer Objekte von der Repräsentation dieser Objekte zu ent-
Exportwege
koppeln. Wir verdeutlichen dies anhand eines Beispiels. Sie können Produkt konkreter Erbauer
dieses Entwurfsmuster z. B. für eine Anwendung verwenden, die
+ baue_teile()
Daten aus einer Datenbanktabelle liest, diese Daten überarbeitet und
+ erhalte_ergebnis()
dann wieder in die Datenbank zurückschreibt. Möchten Sie dieser
Anwendung eine Exportschnittstelle hinzufügen, die Exportmöglich-
Abbildung 3.1 Builder Pattern – Aufbau im UML-Klassendiagramm
keiten in andere Anwendungen anbietet, können Sie unterschiedli-
che Builder definieren, die vom Anwender über die Anwendungs-
Klasse und ihre Rolle Beschreibung
oberfläche ausgewählt werden können, und sie jeweils in anderen
Datenformaten speichern. Ein solcher Builder erzeugt die Objekte, Erbauer Die Erbauerklasse ist eine abstrakte Klassen-
schnittstelle, die für die Erzeugung der komple-
die dann die Daten als CSV-Datei exportieren, ein weiterer Builder
xen Objekte und auch für die Erzeugung der Bau-
die Objekte, die Daten als XML-Dateien exportieren, und ein letzter teile zuständig ist.
Builder könnte die Daten über SAP Smart Forms als PDF aufbereiten
konkreter Erbauer Die Klasse des konkreten Erbauers kümmert sich
und exportieren. Auf diese Weise wird die eigentliche Verarbeitung darum, dass die einzelnen Bauteile während der
der Daten vom Exportprozess getrennt. Implementierung des Produkts erzeugt werden.
Die Erbauerklasse bzw. -schnittstelle gibt dem
konkreten Erbauer den Rahmen sowie die Defini-
3.1.2 Ansatz und Lösung tion vor, wie die Klasse des konkreten Erbauers
Mithilfe eines UML-Diagramms zeigen wir Ihnen zunächst, wie das durch die Repräsentationsschicht implementiert
werden kann. Über die Erbauerschnittstelle kann
Builder Pattern aufgebaut ist. In Abbildung 3.1 sehen Sie fünf ABAP-
das Objekt an das Produkt weitergegeben wer-
Klassen, die zusammen das Builder Pattern bilden.
den.
Bedeutung der Diese Klassen nehmen jeweils eine bestimmte Rolle im Entwurfs-
einzelnen Klassen Tabelle 3.1 Builder Entwurfsmuster – beteiligte Klassen
muster ein, die wir in Tabelle 3.1 genauer erläutern.
66 67
3 Erzeugungsmuster Builder Pattern 3.1
mehrere Bauteile in Kombination sein. Als Ergebnis erhält der Client UML-Diagramms. Die Klasse, die den Direktor repräsentiert, wird in
das konstruierte standardisierte Objekt vom konkreten Erbauer diesem Fall von der Web-Dynpro-Oberfläche über eine Aktion auf-
zurück. gerufen und stößt dadurch die Erzeugung des PDF-Exports (Objekt
der konkreten Erbauerklasse) an. Auf dieser Web-Dynpro-Oberflä-
che gibt es in unserem Beispiel einen Button, der die Methode
BUTTON_AUFTRAG_EXPORT_TO_PDF() auslöst. Klickt der Anwender auf
diesen Button, werden ihm unterschiedliche Exportmöglichkeiten
68 69
3 Erzeugungsmuster Builder Pattern 3.1
zur Auswahl gestellt. Die konkrete Klasse ERBAUER_EXPORT_1 enthält durchführt, den Kunden darüber benachrichtigt, dass sein Auftrag in
alle Methoden, die zur Verfügung stehen, um das Auftragsdokument Bearbeitung ist, und zusätzlich noch einen weiteren Workflow startet.
Dies kann sehr einfach über den Methodenpool der Subklassen realisiert
zu überarbeiten und mit weiteren Informationen anzureichern. In
werden. In dem Subsystem werden dabei z. B. zentrale Klassen des SAP-
der Methode UEBERPRUEFE_EINGABEN() wird z. B. geprüft, ob diese
Systems oder Eigenentwicklungen aufgerufen, die die gewünschten Akti-
Daten korrekt sind. An dieser Stelle kann geprüft werden, ob der onen im System durchführen.
Kunde, für den der Auftrag angelegt wurde, bereits im System vor-
handen ist, ob für ihn eine Bonitätsprüfung vorliegt und vieles mehr.
3.1.4 Umsetzung in ABAP
«Builder»
Direktor erbauer_export_1 In diesem Abschnitt zeigen wir Ihnen, wie Sie das Builder Pattern in Report
auftrag:dokument Überprüfe Eingaben
+ erzeuge_pdf_dokument() ABAP umsetzen können. Wir greifen dazu auf das Beispiel aus Abbil-
+ button_auftrag_export_to_pdf() :void + erzeuge_sap_report() + ist_backend_system_korrekt()
+ erzeuger_auftrag_verkauf(dokument) + erzeuge_ausdruck_bei_drucker() + ist_wiw_korrekt() dung 3.2 zurück. Zur Implementierung des Builder Patterns erstellen
+ ueberpruefe_eingaben() + ist_adresse_korrekt()
+ ueberarbeite_texteingaben() + pruefe_bestellpostionen() wir einen ABAP-Report in Transaktion SE38. In diesem Report wird
+ interpretiere_eingaben() + pruefe_pflichtfelder()
das Pattern umgesetzt und kann hier später auch ausgeführt werden.
Aufruf 1:
button_erzeuge_auftrag(){ Wird der Report später in eine Anwendung integriert, findet dies
erzeuger_1.ueberpruefe_eingaben();
erzeuger_1.ueberarbeite_texteingaben();
«Produkt»
Texteingaben
meistens in einer Verarbeitungsklasse statt, die wiederum ihre eige-
erzeuger_1.interpretiere_eingaben();
erzeuger_1.erzeuge_pdf_dokument(); + pruefe_auf_ungueltige_zeichen() nen Klassen besitzt. Wir verzichten in diesem Kapitel darauf, alle
} + pruefe_auf_pflichteingaben()
+ pruefe_auf_plausibilitaet()
diese Klassen in Transaktion SE24 anzulegen, um das Beispiel für Sie
Aufruf 2: + gleiche_eingaben_mit_merkmalswerte_ab()
button_erzeuge_auftrag(){ übersichtlicher zu gestalten.
erzeuger_1.ueberpruefe_eingaben();
erzeuger_1.ueberarbeite_texteingaben(); Interpretiere
erzeuger_1.interpretiere_eingaben(); Durch das Erzeugen des ABAP-Reports öffnet sich der ABAP Editor
erzeuger_1.erzeuge_sap_report(); + pruefe_bonitaet()
erzeuger_1.erzeuge_ausdruck_bei_drucker(); + pruefe_fruehestmoeglicher_liefertermin() mit der folgenden Codezeile:
} + pruefe_lagerbestand()
REPORT zdp_ar_erz_builder.
Abbildung 3.3 Builder Pattern – UML-Klassendiagramm für Beispielanwendung
Listing 3.1 zeigt die Definition der Klasse, in der das Produkt defi- Produktklasse
niert wird. Diese Produktklasse beinhaltet zwei Methoden und ein
Unterklassen Die Methoden, die von der Erbauerklasse angesprochen werden,
internes Attribut. Das interne Attribut hat den Datentyp STRING und
beinhalten einen standardisierten Aufruf der Unterklassenmethoden
enthält den Namen des Bauteils. Es können noch weitere Informati-
INTERPRETIERE(), TEXTEINGABEN() und UEBERPRUEFE_EINGABEN().
onen und Objekte in dieser Klasse abgelegt werden. Die Methoden
Die Unterklassen sind so realisiert worden, dass jede dieser Klassen
fügen die neuen Bauteile in das Attribut I_BAUTEILE der Klasse ZDP_
andere Methoden aufrufen kann. Sie sind als ein Pool von Funktio-
CL_BUILD_PRODUKT hinzu. Über die Methode ANZEIGEN() können die
nen zu verstehen, die Sie verwenden können. Dazu werden jeweils
Bauteile ausgegeben werden, die im Produkt erzeugt wurden. Die
nur die Informationen benötigt, die die Methoden selbst anfordern.
Methode HINZUFUEGEN() fügt der Bauteilliste neue Bauteile hinzu.
Die Erzeugungsmethoden der Builder-Klasse rufen mit den Unter-
klassen mehrere dieser Funktionen auf, um die Texte und Eingaben CLASS zdp_cl_build_produkt DEFINITION
im Auftragsformular zu überprüfen. Sie können an dieser Stelle alle PUBLIC FINAL
CREATE PUBLIC.
komplexen Methoden programmieren, die für Ihren Einsatzzweck
notwendig sind. PUBLIC SECTION.
DATA bauteile TYPE TABLE OF string.
Aufruf mehrerer Funktionen METHODS hinzufuegen
IMPORTING
Mithilfe des Builder Patterns können Sie z. B. einen Methodenaufruf
!i_bauteile TYPE string.
implementieren, der die erforderlichen Buchungen im Buchungssystem
70 71
3 Erzeugungsmuster Builder Pattern 3.1
72 73
3 Erzeugungsmuster Builder Pattern 3.1
Zweiter konkreter In Listing 3.5 wird die Klasse des zweiten konkreten Erbauers ZDP_ Als Nächstes implementieren Sie den Direktor wie in Listing 3.6. Der Direktor
Erbauer CL_BUILD_KONERB2 implementiert. Es können unterschiedliche Direktor ist dafür zuständig, die Erzeugung der unterschiedlichen
Erbauer erstellt werden, die dem Produkt unterschiedliche Bauteile Bauteile des Produkts anzustoßen und diese in dem Produkt abzu-
hinzufügen können. In einer Unternehmensanwendung kann das speichern. Der Direktor wird vom Client über die Methode KONSTRU-
Produkt z. B. ein Auftrag sein. Der erste konkrete Erbauer erzeugt IERE() aufgerufen. Dieser Aufruf führt dazu, dass die unterschiedli-
dann z. B. Produktionsaufträge, ein zweiter konkreter Erbauer z. B. chen Bauteile für das Produkt erzeugt werden.
Lieferaufträge.
CLASS zdp_cl_build_direktor DEFINITION
CLASS zdp_cl_build_konerb2 DEFINITION PUBLIC FINAL
PUBLIC CREATE PUBLIC.
INHERITING FROM zdp_cl_build_erbauer PUBLIC SECTION.
FINAL CREATE PUBLIC. METHODS konstruiere
PUBLIC SECTION. IMPORTING
METHODS constructor. !i_erbauer TYPE REF TO zdp_cl_build_erbauer.
METHODS erzeuge_bauteil_a PROTECTED SECTION.
REDEFINITION. PRIVATE SECTION.
METHODS erzeuge_bauteil_b ENDCLASS.
REDEFINITION.
METHODS erhalte_ergebnis CLASS zdp_cl_build_direktor IMPLEMENTATION.
REDEFINITION. METHOD konstruiere.
PROTECTED SECTION. i_erbauer->erzeuge_bauteil_a( ).
PRIVATE SECTION. i_erbauer->erzeuge_bauteil_b( ).
DATA produkt TYPE REF TO zdp_cl_build_produkt. ENDMETHOD.
ENDCLASS. ENDCLASS.
Listing 3.6 Builder Pattern – Definition der Direktorklasse
CLASS zdp_cl_build_konerb2 IMPLEMENTATION.
METHOD constructor.
Die Klasse ZDP_CL_BUILD_APPLIKATION, deren Implementierung Sie Client
CALL METHOD super->constructor.
CREATE OBJECT me->produkt. in Listing 3.7 sehen, ist die Anwendungsklasse, die den Client reprä-
ENDMETHOD. sentiert. In dieser Klasse treffen alle Komponenten zusammen, die
für das Builder Pattern benötigt werden. In der einzigen Methode
METHOD erzeuge_bauteil_a. START() werden zunächst alle Objekte der unterschiedlichen Klassen
produkt->hinzufuegen('Bauteil-X').
erzeugt, die benötigt werden, um den Direktor aufzurufen. Der
ENDMETHOD.
Direktor lenkt dann automatisch alle Aktionen, um das Produkt mit
METHOD erzeuge_bauteil_b. seinen Bauteilen zu erzeugen.
produkt->hinzufuegen('Bauteil-Y').
CLASS zdp_cl_build_applikation DEFINITION
ENDMETHOD.
PUBLIC FINAL
CREATE PUBLIC.
METHOD erhalte_ergebnis.
PUBLIC SECTION.
produkt = me->produkt.
DATA lo_erbauer TYPE REF TO zdp_cl_build_erbauer.
r_produkt = produkt.
METHODS start.
ENDMETHOD.
PROTECTED SECTION.
ENDCLASS.
PRIVATE SECTION.
Listing 3.5 Builder Pattern – Definition des zweiten konkreten Erbauers ENDCLASS.
74 75
3 Erzeugungsmuster Builder Pattern 3.1
CLASS zdp_cl_build_applikation IMPLEMENTATION. durch den konkreten Erbauer 1 erzeugt. Hingegen wurden bei Pro-
METHOD start. dukt 2 die Bauteile X und Y durch den konkreten Erbauer 2 erzeugt.
DATA: lo_direktor TYPE REF TO zdp_cl_build_direktor.
DATA: lo_b1 TYPE REF TO zdp_cl_build_konerb1.
DATA: lo_b2 TYPE REF TO zdp_cl_build_konerb2.
DATA: lo_p1 TYPE REF TO zdp_cl_build_produkt.
DATA: lo_p2 TYPE REF TO zdp_cl_build_produkt.
76 77
3 Erzeugungsmuster Factory Pattern 3.2
Klassen hinzugefügt werden, um neue Produkte zu erzeugen. Möch- 왘 Factory Pattern auf Basis von Methoden
ten Sie eine Anwendung entwickeln, die auf neue Anforderungen Factory-Methoden sind statische Methoden, die zur Erzeugung
durch neue Objekte sehr schnell und einfach reagieren kann, emp- von Objekten eines Klassentyps verwendet werden. Das Singleton
fehlen wir Ihnen die Verwendung dieses Entwurfsmusters. Pattern nutzt die Factory-Methode. Dabei liest das Pattern das zu
erstellende Objekt durch die statischen Methoden aus oder lässt
Nachteile Um das Builder Pattern zu implementieren, sind allerdings umfas-
dieses Objekt instanziieren.
sende und vollständige Kenntnisse des Konstruktionsprozesses aller
Objekte der Anwendung erforderlich. Nur so können die Objekte in 왘 Factory Pattern auf Basis von Klassen
der Laufzeitumgebung richtig eingesetzt werden. Dies bedeutet, dass Eine Factory-Klasse basiert auf dem Factory-Methoden-Konzept
bei komplexen Anwendungen alle Objekte vor der Umsetzung erst und erweitert dieses Konzept durch verschiedene Klassen. In Fac-
einmal dokumentiert bzw. evaluiert werden müssen. Dies ist umso tory-Klassen werden nicht nur die zur Entwurfsmusterimplemen-
mehr erforderlich, als die Objekte später bei der Implementierung tierung gehörenden Klassen instanziiert, sondern auch vollstän-
nur noch isoliert voneinander betrachtet werden. dige und komplexe andere Objekte. So wird ein höherer
Abstraktionsgrad erzielt, der es viel leichter erlaubt, eine Factory-
Ein weiterer erheblicher Nachteil ist, dass die Klassen beim Builder
Klasse durch andere Klassen auszutauschen, die ebenfalls dem
Pattern sehr stark miteinander verzahnt sind. Diese Kopplung
Konzept der Factory-Klasse entsprechen.
erlaubt es nicht, die Klassen in anderen Klassen einfach wiederzuver-
wenden. 왘 Factory Pattern auf Basis abstrakter Klassen und Interfaces
Die Implementierung mit einer abstrakten Factory-Klasse ist eine
sehr aufwendige Implementierungsvariante des Entwurfsmusters.
Oft trägt diese Umsetzungsvariante auch den Spitznamen Toolkit.
3.2 Factory Pattern
Die abstrakte Factory-Klasse hat zwei wichtige Merkmale, die
Das Factory Pattern wird im Deutschen auch als Fabrik-Entwurfs- gleichzeitig ihre Vorteile ausmachen:
muster bezeichnet und gehört ebenso wie das Builder Pattern zu den – Während des Erzeugungsprozesses wird nicht nur ein konkre-
GoF-Entwurfsmustern. Das Factory Pattern wird eingesetzt, um die tes Element (d. h. ein Objekttyp) erzeugt, sondern es können
Konstruktion von Objekten von ihren Repräsentationen zu trennen. viele und unterschiedliche Elemente erzeugt werden.
Im Unterschied zum Builder Pattern kann das Factory Pattern aber – Darüber hinaus ist die abstrakte Factory-Klasse sehr flexibel
nicht so einfach nach Belieben ausgebaut werden. Ein mit dem Fac- gebaut, was das Hinzufügen und Austauschen von Objekten
tory Pattern verwandtes Pattern ist das Singleton Pattern, das wir in anhand zusätzlicher Factories vereinfacht.
Abschnitt 3.3 erläutern.
78 79
3 Erzeugungsmuster Factory Pattern 3.2
Das Factory Pattern stellt dazu eine Schnittstelle bereit, die die Diese Factory-Klassen erzeugen die Produkte für den Client, z. B.
Objekte entsprechend erzeugt. Die erzeugten Objekte können mitei- einen Auftrag. Wie dies im Detail abläuft, erläutern wir in diesem
nander verwandt oder auf andere Weise voneinander abhängig sein. Abschnitt.
80 81
3 Erzeugungsmuster Factory Pattern 3.2
den Objekts können dazu unterschiedlich viele Factory-Klassen Dabei werden weitere Methoden angestoßen, die dann sowohl das
verwendet werden. Objekt des Auftrags als auch das der konkreten Factory-Klasse erzeu-
Die konkreten Factory-Klassen übergeben die Objekte mithilfe gen. Diese abstrakte Factory ruft die Methode factory_methode() in
eines Rückgabewertes an die Klasse client, also der Anwender, der konkreten Factory-Klasse auf. Diese Methode erzeugt ein kon-
zurück. Die abstrakte Factory-Klasse definiert den Rahmen, welche kretes Objekt, in diesem Fall einen Auftrag auf Basis der Informatio-
Methoden in den konkreten Factory-Klassen zur Verfügung stehen. nen, die sie über die abstrakte bzw. die konkrete Factory-Klasse
Durch den Aufruf eines Objekts dieser Factory-Klasse wird dieses erhalten hat. Dieses erzeugte Objekt wird über die Rückgabeparame-
Objekt durch die Methode erzeuge_auftrag() erzeugt. Der An- ter der Methode zurück an die Client-Klasse gegeben. Zur Objekter-
wender erhält von dem abstrakten Factory-Klassen-Objekt ein zeugung spricht der Client die konkrete Factory-Klasse über die abs-
Objekt zurück, nämlich seinen konkreten Auftrag. In unserem trakte Factory-Klasse an.
Beispiel können unterschiedliche Aufträge auf Basis verschiedener
Klassen erzeugt werden, die eine gemeinsame Superklasse abs- Client abstrakte_ konkrete_factory konkreter_auftrag
factory
trakter_auftrag haben. Um die konkreten Klassen ausprägen zu
können, müssen diese zunächst klassifiziert werden. Diese Klassi- eine_operation()
fizierung erfolgt ebenfalls über eine Factory-Klasse, die dem An-
factory_methode()
wender in der Klasse client zur Verfügung gestellt wird.
erzeuge_konkreter_auftrag()
왘 Client
Der Client selbst hat mit der eigentlichen Erzeugung der konkre-
ten Objekte nichts zu tun. Seine einzige Aufgabe ist es, die Factory-
Klasse auszuwählen, die das Objekt erzeugen soll. Für den Ausla-
gerungsauftrag in der SAP-Komponente SD muss z. B. eine Klasse
erzeugt werden. Das Factory Pattern stellt alle erforderlichen Abbildung 3.7 Factory Pattern – UML-Sequenzdiagramm
Funktionen für die Erzeugung der Objekte zur Verfügung.
Zusätzliche Der entscheidende Vorteil des abstrakten Factory Patterns ist die 3.2.3 Einsatzbeispiel
Abstraktionsebene Nutzung der zusätzlichen Abstraktionsebene für die Objekterzeu-
Das Factory Pattern kann auch dann verwendet werden, wenn das zu
gung. Der Client nutzt zur Laufzeit die durch die abstrakte Klasse
erzeugende Objekt der erzeugenden Klasse unbekannt sein soll. Erst
abstrakte_factory zur Verfügung gestellten Methoden. Diese
durch die Unterklassen wird definiert, welche Objekte erzeugt wer-
Klasse ist ein Platzhalter für eine konkrete Klasse zur Auftragserzeu-
den sollen. Auf diese Weise können durch die Factory-Klassen ganz
gung, die von dieser Klasse erbt und dadurch alle Standardmethoden
unterschiedliche Objekte erzeugt werden. Der Aspekt der Erzeugung
von ihr übernimmt. Die Ausimplementierung der abstrakten Klasse
wird in der Factory-Klasse zentralisiert und völlig von den zu erzeu-
erfolgt in der Klasse konkrete_factory. Diese bleibt dem Client ver-
genden Objekten getrennt.
borgen, er kann sie jedoch für die Objekterzeugung nutzen.
In Abbildung 3.8 skizzieren wir als Beispiel eine Anwendung zur Beispiel:
Ablauf einer In Abbildung 3.7 haben wir den Ablauf einer nach dem Factory Pat- Belegarten
Erzeugung verschiedener Belegarten im SAP-Finanzwesen FI (Einbu-
Factory-Pattern- tern konzipierten Anwendung in einem Sequenzdiagramm skizziert. erzeugen
Anwendung chungs-, Ausbuchungs- und Umbuchungsbelege). Dabei kann es sich
Der Client ruft hier eine Methode auf. Diese Methode wird z. B. über
z. B. um Einbuchungsbelege für bestimmte Paletten in einem Lager
die Anwendungsoberfläche vom Anwender ausgelöst, z. B. durch
handeln. Mit der konkreten Factory-Klasse ZDP_CL_FI_VERARBEITUNG
den Klick auf einen Button. Die Implementierung dieser Methode
lassen sich unterschiedliche Belegarten erzeugen. Die Belegobjekte
ruft wiederum eine Methode der abstrakten Factory-Klasse auf.
werden hier zentral erzeugt und zurückgegeben. Die konkrete Erzeu-
82 83
3 Erzeugungsmuster Factory Pattern 3.2
gung der unterschiedlichen Belegarten erfolgt dann in unterschiedli- 3.2.4 Umsetzung in ABAP
chen Factory-Methoden ERZEUGE_FI_AUSBUCHUNG(), ERZEUGE_FI_ In diesem Abschnitt setzen wir das Factory Pattern in einer ABAP- Belegerzeugung
EINBUCHUNG() und ERZEUGE_FI_UMBUCHUNG(). Anwendung um, die zwei verschiedene Belegarten erzeugt, und set- mit abstrakter
Factory
Anstelle der konkreten Factory-Klasse können Sie auch mit einer abs- zen dabei in Erweiterung des Beispiels aus dem vorangegangenen
trakten Factory-Klasse arbeiten und erbende Factory-Klassen zwi- Abschnitt eine abstrakte Factory-Klasse ein. Die beiden Belegarten
schenschalten. So hätten Sie eine breitere Schnittstelle, die Ihnen Einbuchungs- und Ausbuchungsbeleg werden von zwei verschiede-
mehr Möglichkeiten bietet, unterschiedliche Belegarten zu erzeugen. nen Factory-Klassen erzeugt. Diese beiden Objektklassen basieren
Sinnvoll ist diese Abstraktionsebene nur, wenn die Clusterung der auf der abstrakten Superklasse ZDP_CL_FACT_BELEG. Die konkreten
Belegerzeugung innerhalb eines Projekts möglich ist. Die Klasse ZDP_ Erbauerklassen basieren auf der abstrakten Factory-Superklasse ZDP_
CL_FI_VERARBEITUNG kann in der Implementierung sehr einfach CL_FACT_ERBAUER, die alle Informationen zentral für die konkreten
durch die Anwendung, also den Client, angesprochen werden. Beim Factory-Klassen bereitstellt. Die konkreten Erbauerklassen erben
Erzeugen der einzelnen FI-Belege werden diese Belege über das also von dieser Superklasse ZDP_CL_FACT_ERBAUER.
Attribut I_BELEGE durch die Methode HINZUFUEGEN() einer internen Für das Factory Pattern legen Sie zunächst über Transaktion SE38 Report zur
Tabelle hinzugefügt. Diese Methode HINZUFUEGEN() wird über eine einen ABAP-Report an. Klassendefinition
Client-Klasse aufgerufen, in unserem Beispiel bezeichnen wir sie als
REPORT zdp_ar_erz_factory.
ZDP_CL_CLIENT.
In Listing 3.9 wird die abstrakte Superklasse ZDP_CL_FACT_BELEG Definition
definiert. Superklasse
FI-Beleg
CLASS zdp_cl_fact_beleg DEFINITION
PUBLIC
ABSTRACT
CREATE PUBLIC.
PUBLIC SECTION.
PROTECTED SECTION.
FI-Einbuchungsbeleg FI-Ausbuchungsbeleg FI-Umbuchungsbeleg
PRIVATE SECTION.
(Rechnung)
ENDCLASS.
Listing 3.9 Factory Pattern – Definition der Beleg-Superklasse
FI-Verarbeitung
Im nächsten Schritt werden die konkreten Belegklassen ZDP_CL_FACT_ Definition der
- I_BELEGE :LISTE<BELEGE> konkreten
KONBELEIN für den Einbuchungsbeleg und ZDP_CL_FACT_KONBELAUS
Factory-Methoden: Belegklassen
+ ERZEUGE_FI_AUSBUCHUNG() :FI_BELEG
ERZEUGE_FI_AUSBUCHUNG( ) für den Ausbuchungsbeleg definiert (siehe Listing 3.10). Diese Beleg-
+ ERZEUGE_FI_EINBUCHUNGSBELEG() :FI_BELEG
ERZEUGE_FI_EINBUCHUNG( ) klassen erben von der in Listing 3.9 definierten Superklasse ZDP_CL_
+ ERZEUGE_FI_UMBUCHUNG() :FI_BELEG
ERZEUGE_FI_UMBUCHUNG( )
FACT_BELEG. Die Belegklassen selbst können Sie noch ausgestalten,
um die verschiedenen Belegausprägungen zu definieren.
84 85
3 Erzeugungsmuster Factory Pattern 3.2
PUBLIC SECTION. In Listing 3.12 wird definiert, dass die konkrete Erbauerklasse ZDP_ Definition
PROTECTED SECTION. CL_FACT_KONERBEIN von der abstrakten Klasse ZDP_CL_FACT_ERBAUER der erbenden
PRIVATE SECTION. Factory-Klassen
erbt. Dies bedeutet, dass alle Methoden der vererbenden Klasse in
ENDCLASS.
der Klasse ZDP_CL_FACT_KONERBEIN zur Verfügung stehen. Damit die
CLASS zdp_cl_fact_konbelaus DEFINITION konkrete Erbauerklasse den Einbuchungsbeleg erzeugt, muss die
PUBLIC Methode ERZEUGE_BELEG() redefiniert werden. Dabei bleibt die
INHERITING FROM zdp_cl_fact_beleg Methode der Superklasse unverändert. Sie wird bei der Redefinition
FINAL
lediglich für die Objekte der Klasse ZDP_CL_FACT_KONERBEIN über-
CREATE PUBLIC.
schrieben. Bei der Klasse ZDP_CL_FACT_KONERBAUS funktioniert dieses
PUBLIC SECTION. Prinzip auf die gleiche Weise.
PROTECTED SECTION.
PRIVATE SECTION. CLASS zdp_cl_fact_konerbein DEFINITION
ENDCLASS. PUBLIC
INHERITING FROM zdp_cl_fact_erbauer
Listing 3.10 Factory Pattern – Definition der erbenden Belegklassen
FINAL
CREATE PUBLIC.
Definition der In Listing 3.11 wird die abstrakte Factory-Klasse definiert und imple-
abstrakten mentiert – also die Klasse, der innerhalb des Factory Patterns die PUBLIC SECTION.
Erbauer-Factory METHODS erzeuge_beleg
Rolle des Erbauers zukommt. Die Factory-Klasse ist für den Erzeu-
REDEFINITION.
gungsprozess der zwei Belegtypen zuständig. Von der abstrakten
PROTECTED SECTION.
Superklasse ZDP_CL_FACT_ERBAUER erben in unserem Beispiel zwei PRIVATE SECTION.
konkrete Factory-Klassen. Durch Realisierung der Factory-Klasse als ENDCLASS.
abstrakte Superklasse ist es möglich, die Anzahl der erbenden Fac-
tory-Klassen beliebig zu erhöhen. Diese Factory-Klassen verfügen CLASS zdp_cl_fact_konerbein IMPLEMENTATION.
METHOD erzeuge_beleg.
jeweils über die gleiche Methode ERZEUGE_BELEG() zur Erzeugung
CREATE OBJECT r_beleg TYPE zdp_cl_fact_konbelein.
von Belegen. In der abstrakten Factory wird der Methodenrahmen ENDMETHOD.
der Methode ERZEUGE_BELEG() definiert. Diese Methode wird in den ENDCLASS.
konkreten Factory-Klassen so ausimplementiert, dass die Belegob-
jekte erzeugt werden können. CLASS zdp_cl_fact_konerbaus DEFINITION
PUBLIC
CLASS zdp_cl_fact_erbauer DEFINITION INHERITING FROM zdp_cl_fact_erbauer
PUBLIC FINAL
ABSTRACT CREATE PUBLIC.
CREATE PUBLIC. PUBLIC SECTION.
86 87
3 Erzeugungsmuster Factory Pattern 3.2
CLASS zdp_cl_fact_applikation DEFINITION Listing 3.13 Factory Pattern – Definition der Hauptausführungsklasse, d. h. der
PUBLIC FINAL Applikationsklasse
CREATE PUBLIC.
88 89
3 Erzeugungsmuster Factory Pattern 3.2
Aufruf im Zur Verwendung des Factory Patterns müssen wir im letzten Schritt 왘 Kapselung
ABAP-Report die Applikationsklasse ZDP_CL_FACT_APPLIKATION über den zu Durch das Factory Pattern können konkrete Klassen abgeschirmt
Beginn definierten ABAP-Report ZDP_AR_ERZ_FACTORY aufrufen. Dies werden, sodass Entwickler die internen Klassen nicht verwenden
erfolgt über folgenden Quellcode: bzw. Objekte damit erzeugen können. Dadurch werden die
REPORT zdp_ar_erz_factory.
Robustheit und Sicherheit der Anwendung verbessert.
DATA lo_app TYPE REF TO zdp_cl_fact_applikation. 왘 Konsistenz
CREATE OBJECT lo_app. Durch die Kapselung kann außerdem die Konsistenz der Daten
lo_app->start( ).
sichergestellt werden, wodurch sich unterscheiden lässt, welche
Listing 3.14 Factory Pattern – Aufruf im ABAP-Report Daten zur eigentlichen Factory-Klasse und welche zum konkreten
erzeugenden Objekttyp (z. B. Beleg, Auftrag) gehören.
Wird das in unserem Beispiel implementierte Factory Pattern in
왘 Flexibilität
einem ABAP-Report gestartet, werden durch das Durchlaufen der
Die zu erzeugenden Objekte können sehr einfach durch andere
LOOP AT-Schleife die einzelnen Erbauer initialisiert. Durch den Auf-
Objekte ausgetauscht werden.
ruf der Erzeugungsmethoden wird eine Ausgabe erzeugt, anhand
derer Sie erkennen können, wie dieses Entwurfsmuster arbeitet 왘 Abstraktion
(siehe Abbildung 3.9). Bei der Prüfung des von der ersten konkreten Durch die Abstraktion in der Superklasse können die Factory- und
Erbauerklasse zu erzeugenden Objekts wird die erste Ausgabe Erbauerklassen einfach und schnell erweitert werden. Dazu müs-
erzeugt. Dabei wird anhand des absoluten Klassennamens des sen nur die Factory-Schnittstelle und die konkrete Factory-Klasse
Objekts erkannt, welches der Objekte erzeugt wurde. Wie auch bei erzeugt werden, um das Entwurfsmuster um einen zusätzlichen
der Applikationsklasse ZDP_CL_FACT_APPLIKATION gibt es hierfür eine Objekttyp zu erweitern.
Standardklasse CL_ABAP_REFDESCR von SAP. In unserem Beispiel kön- 왘 Wiederverwendbarkeit
nen wir auf diese Weise ableiten, welcher Beleg erzeugt wurde. Durch diese Flexibilität und Abstraktion ist das Factory Pattern
leicht wiederverwendbar. Jedes beliebige Produkt jeder Produkt-
Das Ergebnis dieser Implementierung erhalten Sie durch die Ausfüh-
familie kann mithilfe des Patterns sehr einfach erzeugt werden.
rung des ABAP-Reports ZDP_AR_ERZ_FACTORY über Transaktion SE38.
Die zu erzeugenden Produkte können in einem anderen Kontext
Dabei wird folgende Ausgabe angezeigt:
einfach durch andere ausgetauscht werden.
왘 Einfachheit
Das komplette Factory Pattern kommt sowohl aufseiten des Clients
als auch aufseiten der Factory-Klasse mit nur wenig Code aus.
Das Factory Pattern hat in bestimmten Fällen aber auch Nachteile. Nachteile
Sollen mit diesem Pattern Produkte erzeugt werden, die nicht zur
ursprünglichen Produktfamilie gehören, muss die Schnittstelle der
Abbildung 3.9 Factory Pattern – Reportausgabe abstrakten Factory-Klasse vollständig angepasst werden bzw. eine
neue konkrete Factory-Klasse entwickelt und der abstrakten Factory-
3.2.5 Evaluation Klasse durch Methoden bekannt gemacht werden.
Einsatzgründe Das Factory Pattern bietet wie das Builder Pattern erhebliche Vor- Häufig stellt sich bei der Konzeption einer Anwendung die Frage, ob Builder vs.
zur Erzeugung von Objekten besser das Builder oder das Factory Pat- Factory Pattern
teile bei der Erzeugung von Objekten. Sechs entscheidende Faktoren
sprechen dafür, dieses Pattern zu nutzen: tern verwendet werden sollte. In der Regel erweist sich die Verwen-
90 91
3 Erzeugungsmuster Singleton Pattern 3.3
dung des Factory Patterns als vorteilhafter. Bei der Umsetzung des konkretes Objekt instanziieren lässt. Durch weitere Instanziierungen
Builder Patterns muss nur der konkrete Erbauer bekannt sein, um (also weitere Aufrufe der Methode erhalte_instanz()) wird immer
mit diesem Entwurfsmuster Objekte zu erzeugen. Bei der Verwen- das gleiche Objekt zurückgegeben.
dung des Factory Patterns hingegen müssen alle Factory-Objekte
Die Verwendung des Singleton Patterns kann in SAP-Anwendungen
bekannt sein, um Objekte zu erzeugen. Dies stellt bei einfachen, aber
vorteilhaft sein, da es sowohl in ABAP als auch in Web Dynpro ABAP
auch komplexeren Anwendungen kein Problem dar.
den Ansatz der globalen Variablen nicht so gibt, wie man ihn aus
Um ein Builder Pattern zu verwenden, sollten die zu erzeugenden anderen Programmiersprachen kennt.
Produkte die gleiche Basis haben, d. h., es gibt eine gemeinsame
Durch das Singleton-Pattern wird in ABAP und Web Dynpro ABAP
Superklasse, die alle Standardinformationen enthält und von der die
ein ähnlicher Ansatz wie der der globalen Variablen zur Verfügung
Produkte alle erben. Mit dem Factory Pattern können hingegen sehr
gestellt.
einfach ganz unterschiedliche Objekte, die nicht über eine gemein-
same Superklasse miteinander verbunden sind, erzeugt werden. Die- Durch die Verwendung des Singleton Patterns erhalten Sie dasselbe
ser Vorteil kommt vor allem bei Verwendung der abstrakten Factory Objekt einer Klasse immer wieder, es kann statisch ausgelesen wer-
deutlich zum Tragen. den, und Sie können es direkt weiterverarbeiten. Es wird nur eine
Instanz eines Objekts erzeugt und sichergestellt, dass auch nur eine
Instanz verwendet wird.
3.3 Singleton Pattern
3.3.2 Ansatz und Lösung
Auch das Singleton Pattern (Einzelstück-Entwurfsmuster) gehört zu
den GoF-Mustern. Es wird eingesetzt, um die Instanziierung einer In dem Klassendiagramm in Abbildung 3.10 haben wir den Aufbau Singleton-Klasse
Klasse auf genau eine Instanz zu beschränken. des Singleton Patterns skizziert. Das Pattern enthält eine einzige
Klasse Singleton. In dem UML-Klassendiagramm stellt der Client die
In der SAP-Buchhaltung kann das Singleton Pattern z. B. dazu ver- Anwendungsklasse dar bzw. die Methode, wie diese Klasse an unter-
wendet werden, ein Objekt, in dem allgemeine Informationen wie schiedlichen Stellen in einer Anwendung integriert werden kann.
Buchungskreise und Kontenpläne zum Auslesen bereitstehen, für
alle Klassen zur Verfügung zu stellen – so ähnlich wie eine globale
Variable. Auf dieses Objekt kann jede Klasse in der Anwendung Client Singleton
zugreifen und Informationen für alle Mitverwender zentral in dem - instanz :singleton
+ operation() «verwendet»
Objekt ablegen. Beachten Sie jedoch, dass der Einsatz dieses Patterns
nicht als Alternative zu globalen Variablen dienen sollte, sondern als + erhalte_instanz() :singleton
- singleton()
Lösung für die Probleme, die durch den Einsatz von globalen Varia-
blen entstehen können. Unter diese Probleme fallen z. B. unbeab-
sichtigte Variablenänderungen, Mehrfachreferenzen auf ein Objekt,
operation(){
eine schlechtere Wiederverwendbarkeit und Mehraufwand beim
Testen. s = singleton.erhalte_instanz()
}
3.3.1 Problem
Abbildung 3.10 Singleton Pattern – UML-Klassendiagramm
Singuläres Objekt Durch die Verwendung des Singleton Patterns in einer Anwendung
können Sie sicherstellen, dass sich aus einer Klasse immer nur ein
92 93
3 Erzeugungsmuster Singleton Pattern 3.3
Methode Die Singleton-Klasse besitzt das private Attribut instanz, das das ein-
erhalte_instanz() zige instanziierte Objekt der Singleton-Klasse beinhaltet. In dieser erhalte_instanz() erhalte_instanz()
system kann leider nur durch Tabellen oder mithilfe ähnlicher Work- zwischengespeichert werden können. Ein häufiger Verwendungs-
arounds abgebildet werden. In ABAP gibt es dazu sogenannte Shared zweck besteht z. B. im Kontext zentral gespeicherter Einstellungen.
Objects, die immer für einen Benutzer in einer Session zur Verfügung Dabei werden zentrale Data Store Objects (DSO) auf der Datenbank-
stehen. schicht im System angelegt, in denen alle wichtigen Parameter einer
94 95
3 Erzeugungsmuster Singleton Pattern 3.3
Anwendung konfiguriert werden können. In solchen DSOs sollten vorhanden ist, wird dies automatisch erzeugt und erst danach dem
nur Bewegungsdaten gespeichert werden. Andere Informationen Anwender zurückgegeben.
sollten in Datenbanktabellen abgespeichert werden.
In dieser Anwendung kommt nun das Singleton Pattern zum Einsatz. 3.3.4 Umsetzung in ABAP
Es lädt alle Parameter beim Aufruf der Anwendung und speichert Zunächst wird ein ABAP-Report benötigt, den Sie in Transaktion
diese intern als eigenes Objekt ab. So kann bei einem erneuten Auf- SE38 erzeugen können:
ruf der Parameter viel schneller auf diese Variablen zugegriffen wer-
REPORT zdp_ar_erz_singleton.
den, als wenn man bei jedem Aufruf auf die Datenbankschicht
zugreifen und die Parameter dort über eine SELECT-Anweisung abru- In diesem ABAP-Report rufen wir später die Entwurfsmusterimple-
fen müsste. mentierung auf, in der verschiedene Klassen realisiert sind.
Beispiel: Ein weiteres Beispiel wäre eine unternehmensinterne Web-Dynpro- Im ersten Schritt wird die Klasse ZDP_CL_SING_SINGLETON erzeugt Singleton-Klasse
Artikeldefinition (siehe Listing 3.15). Die einzige Methode dieser Klasse, ERHALTE_ implementieren
Anwendung, über die unterschiedliche Artikel, z. B. Büromateria-
lien, bestellt werden können. Diese werden zunächst definiert, und INSTANZ(), gibt das initialisierte Objekt zurück, das in der Klasse
anschließend wird ein Bestellformular ausgegeben. Das Singleton gespeichert wurde. Ist die Klasse noch nicht initialisiert worden,
Pattern kann hier dazu eingesetzt werden, die verschiedenen Artikel wird automatisch ein neues Objekt der Klasse erzeugt und in das
in der Singleton-Klasse in einer Objektliste als Attribute der Klasse zu interne Attribut LO_INSTANZ abgespeichert.
sammeln. Auf diese zentrale Liste kann jede Klasse zugreifen und hat CLASS zdp_cl_sing_singleton DEFINITION
so alle aktuellen Artikel zur Verfügung, die als Objekt bereits zu der PUBLIC FINAL
Liste hinzugefügt worden sind. CREATE PUBLIC.
PUBLIC SECTION.
Als Programmierer müssen Sie so nicht umständlich den Web-Dyn- METHODS constructor.
pro-Kontext verwenden, um alle Details der Artikel abzuspeichern; CLASS-METHODS erhalte_instanz
RETURNING
die Anwendung kann daher viel einfacher umgesetzt werden. Statt-
VALUE(r_instanz) TYPE REF TO zdp_cl_sing_singleton.
dessen sammeln Sie alle Informationen zu den Artikeln als Objekte PROTECTED SECTION.
in der Tabelle in der Singleton-Klasse. Beim Weitergeben der Bestel- PRIVATE SECTION.
lung, also des Singleton-Objekts, das über die Methode erhalte_ CLASS-DATA lo_instanz TYPE REF TO zdp_cl_sing_singleton.
ENDCLASS.
instanz() ausgelesen werden kann, können Sie die Objekte der
internen Liste einfach abrufen und verarbeiten. Das Hinzufügen der CLASS zdp_cl_sing_singleton IMPLEMENTATION.
Artikel in das Singleton-Objekt kann durch diesen Ansatz an ver- METHOD constructor.
schiedenen Stellen im Quellcode flexibel erfolgen. ENDMETHOD.
METHOD erhalte_instanz.
Mehrfach- Als Anwendungszweck besonders hervorzuheben ist die Verhinde- IF lo_instanz IS INITIAL.
instanzen rung von Mehrfachinstanzen von Objekten. Dies kann zwar theore- CREATE OBJECT lo_instanz.
verhindern ENDIF.
tisch auch über statische Attribute realisiert werden. Durch das Single-
r_instanz = lo_instanz.
ton Pattern wird jedoch verhindert, dass mehrere Objekte einer ENDMETHOD.
Klasse erzeugt werden. ENDCLASS.
Null-Referenz Darüber hinaus kann auch eine Null-Referenz verhindert werden. Listing 3.15 Singleton Pattern – Definition und Implementierung der Singleton-
Klasse
verhindern Wenn bei einem Zugriff auf das Entwurfsmuster noch kein Objekt
96 97
3 Erzeugungsmuster Singleton Pattern 3.3
Klasse zum Aufruf Um das Singleton Pattern verwenden zu können, implementieren REPORT zdp_ar_erz_singleton.
des Patterns wir noch die Klasse ZDP_CL_SING_APPLIKATION. Dies ist die Client- DATA lo_app TYPE REF TO zdp_cl_sing_applikation.
CREATE OBJECT lo_app.
Klasse, die definiert, wie dieses Entwurfsmuster später in einer
lo_app->start( ).
Anwendung implementiert werden kann. Alternativ ist es allerdings
auch möglich, diese Klasse wegzulassen und den Quellcode direkt in Listing 3.17 Singleton Pattern – Aufruf im ABAP-Report
Listing 3.16 Ausführung des Singleton-Entwurfsmusters wichtiges Thema, um Informationen zentral und für alle Klassen,
Methoden und Objekte zur Verfügung zu stellen. Das Singleton Pat-
Methode START Um den ABAP-Report ZDP_AR_ERZ_SINGLETON ausführen zu können, tern verfolgt einen objektbasierten Ansatz zur Verwendung globaler
aufrufen sehen wir die in Listing 3.17 aufgeführtem Codezeilen in dem ABAP- Variablen. Es kann sehr einfach klassenübergreifend verwendet wer-
Report vor. den, ohne dabei spezielle ABAP-Konstrukte verwenden zu müssen,
um es verfügbar zu machen. Diese ABAP-Konstrukte wären sehr auf-
wendig und fehleranfällig in der Implementierung.
98 99
3 Erzeugungsmuster Prototype Pattern 3.4
Vorteile Die Vorteile des Singleton Patterns lassen sich wie folgt zusammen- der Laufzeit kann entschieden werden, welche Objekte für diese
fassen: zwei Variablen erzeugt werden sollen. In der Definition enthalten
diese beiden Variablen generell die Definition eines Interfaces.
왘 Einfachheit
Eine Singleton-Klasse ist sehr einfach und schnell entwickelt und 왘 Lazy Loading
hat gegenüber den globalen Variablen insofern einen erheblichen Sie können die Erzeugung der Singleton-Klasse immer nur dann
Vorteil, als sie flexibel erweiterbar und vielfältiger einsetzbar ist. anstoßen, wenn sie auch benötigt wird – dies nennt man auch Lazy
Neben Variablen können auch Objekte in der Singleton-Klasse Loading.
abgespeichert werden. Darüber hinaus ist dieses Entwurfsmuster Auch bei diesem Pattern gibt es Einschränkungen für die Verwend- Einschränkungen
in der Anwendung besser und übersichtlicher handhabbar, als es barkeit. Wenn das Pattern in einer Anwendung zu häufig eingesetzt
globale Variablen sind. wird, leidet deren Übersichtlichkeit. Dies ist vor allem beim objekt-
Im Kundennamensraum erhalten Sie durch die Verwendung die- orientierten Programmieren in ABAP der Fall, weil dadurch das Ent-
ses Entwurfsmusters einen deutlich übersichtlicheren ABAP-Code. wurfsmuster an vielen Stellen mit den gleichen Abfragen verwendet
Es sind keine globalen Variablen vorhanden, die überall verwen- werden kann.
det werden, sondern alle globalen Variablen sind in der Singleton-
Ein anderer Nachteil ist, dass bei der Anwendung des Singleton Pat-
Klasse gekapselt. Sie können z. B. zehn oder 20 globale Variablen
terns unterschiedliche Klassen entstehen, die jeweils für bestimmte
erstellen, die entsprechend den Namenskonventionen alle mit
Objekte gültig sind. Daher muss die Zuordnung der zu verwenden-
dem Präfix gv anfangen. Bei der Verwendung des Singleton Pat-
den Pattern-Klasse klar definiert werden, da es sonst zu Inkonsisten-
terns wird dagegen nur ein Objekt angelegt, das alle globalen Vari-
zen kommen kann. Die Transparenz und die Wartbarkeit der
ablen enthält, auf das sehr einfach z. B. über die Bezeichnung
Anwendung werden infolgedessen eingeschränkt.
singletonobjekt-variable1 zugegriffen werden kann.
100 101
3 Erzeugungsmuster Prototype Pattern 3.4
3.4.1 Problem faces prototype_faehig benötigt. Dieses Interface stellt in den ein-
Kopie einer Das Prototype Pattern wird eingesetzt, um Objekte auf Basis von zelnen Objekten die standardisierte Methode klonen() bereit. Durch
Vorlage Vorlagen, d. h. Prototypen einer Instanz, zu erzeugen. Dabei werden diese Methode hat der Entwickler die Möglichkeit, das Objekt zu
die vorhandenen Instanzen der Objekte kopiert, und das neue duplizieren. Dieses duplizierte Objekt erhält er als Rückgabeparame-
Objekt wird an die neuen Bedürfnisse angepasst. Innerhalb des Pro- ter von der Methode zurück.
totype Patterns kann nicht nur ein Objekt, sondern es können unter- Um das Entwurfsmuster zu initialisieren, rufen Sie die statische
schiedlich viele Objekte kopiert werden, die dazu dem Entwurfsmus- Methode erhalte_instanz() der Klasse prototype_factory auf,
ter nicht bekannt sein müssen. über die Sie das Objekt erhalten.
Ein weiterer Vorteil entsteht, wenn die Klassen – bzw. die Objekte Dynamischer
dieser Klassen – erst während der Laufzeit bekannt sind. Dank dieser Einsatz
Einlagerungsbeleg Auslagerungsantrag Umlagerungsbeleg
dynamischen Programmierweise können Sie z. B. Vorlagenobjekte
- name :string - name :string - name :string
102 103
3 Erzeugungsmuster Prototype Pattern 3.4
wird dann ein Workflow in der SAP-Anwendung gestartet, der letzt- METHOD erhalte_id.
lich zur Auslagerung des Artikels führt. In diesem Beispiel kann nicht r_id = me->id.
ENDMETHOD.
nur der Standardauftrag zur Erzeugung eines individuellen Auftrags
ENDCLASS.
kopiert werden, sondern auch bereits vorhandenen Aufträgen kön-
Listing 3.18 Prototype Pattern – abstrakte Prototyp-Klasse
nen abhängige Objekte, wie z. B. auszulagernde Artikel, Genehmi-
gungen oder Bearbeitungshistorien, angehängt werden.
Die Implementierung eines konkreten Prototyps findet in der eige- Konkrete
nen Klasse ZDP_CL_PTYPE_KONTYPE1 statt. Diese Klasse erbt von der Prototyp-Klasse
3.4.4 Umsetzung in ABAP abstrakten Prototyp-Klasse. Durch diese Vererbung sind die Imple-
ABAP-Report und Genau wie die bereits beschriebenen Erzeugungsmuster wird auch mentierungen der Methode ERHALTE_ID() sowie des Konstruktors in
Klassendefinition das Prototype Pattern in einem ABAP-Report ausgeführt, den Sie in der konkreten Klasse bereits vorhanden. Zusätzlich muss noch die
Transaktion SE38 anlegen: Methode DUPLIZIEREN() implementiert werden. Wie Sie in Listing
3.19 sehen, wird dabei das Objekt der Klasse zurückgegeben.
REPORT zdp_ar_erz_prototype.
CLASS zdp_cl_ptype_konptype1 DEFINITION
Das Prototype Pattern basiert auf der abstrakten Klasse ZDP_CL_ PUBLIC
PTYPE_PROTOTYPE. Diese Klasse hat zwei Methoden, die notwendig INHERITING FROM zdp_cl_ptype_prototype
sind, um Objekte zu kopieren. Im Codebeispiel in Listing 3.18 erhält FINAL
das Objekt über die Konstruktor-Methode eine eindeutige ID, die CREATE PUBLIC.
PUBLIC SECTION.
sich nicht ändert, wenn ein Objekt geklont wird. Über die Methode
METHODS duplizieren
ERHALTE_ID() kann diese ID abgefragt werden.
REDEFINITION.
CLASS zdp_cl_ptype_prototype DEFINITION PROTECTED SECTION.
PUBLIC ABSTRACT PRIVATE SECTION.
CREATE PUBLIC. ENDCLASS.
PUBLIC SECTION.
INTERFACES if_os_clone. CLASS zdp_cl_ptype_konptype1 IMPLEMENTATION.
METHODS constructor METHOD duplizieren.
IMPORTING r_prototype ?= me->if_os_clone~clone( ).
!i_id TYPE string. ENDMETHOD.
METHODS duplizieren ENDCLASS.
RETURNING Listing 3.19 Prototype Pattern – Implementierung der konkreten Prototyp-Klasse
VALUE(r_prototype) TYPE REF TO zdp_cl_ptype_prototype.
METHODS erhalte_id
Um das Prototype Pattern verwenden zu können, wird noch die wei- Klasse zum Aufruf
RETURNING des Patterns
tere Klasse ZDP_CL_PTYPE_APPLIKATION benötigt, die angibt, wie die-
VALUE(r_id) TYPE string.
PROTECTED SECTION. ses Entwurfsmuster in einer Web-Dynpro-Anwendung eingesetzt
PRIVATE SECTION. werden soll. Sie können diese Klasse allerdings auch weglassen und
DATA id TYPE string. den Quellcode direkt in den ABAP-Report schreiben.
ENDCLASS.
In der Methode START() wird zu Beginn das Objekt LO_P1 des kon-
CLASS zdp_cl_ptype_prototype IMPLEMENTATION. kreten Prototyps erstellt. Dieses Objekt hat die I_ID = 1. Wird nun
METHOD constructor. die Methode DUPLIZIEREN() aufgerufen, wird ein neues Objekt auf
me->id = i_id.
Basis des Originalobjekts erzeugt. Rufen Sie vor dem Aufrufen der
ENDMETHOD.
Methode DUPLIZIEREN() die Methode ERHALTE_ID() auf, erhalten Sie
104 105
3 Erzeugungsmuster Prototype Pattern 3.4
die aktuelle ID des Objekts. Im Beispiel aus Listing 3.20 ist dies I_ID Das Ergebnis dieser Implementierung erhalten Sie durch die Ausfüh-
= 1. Nach dem Klonen erhält das neue Objekt die gleiche ID wie das rung des ABAP-Reports ZDP_AR_ERZ_PROTOTYPE über Transaktion
ursprüngliche Objekt. SE38. Dabei wird die Ausgabe wie in Abbildung 3.14 angezeigt:
CLASS zdp_cl_ptype_applikation IMPLEMENTATION. Die Zeilen Original-Objekt: {0} id=1 und Geklontes Objekt: {0}
METHOD start. id=1 werden durch den ABAP-Report ausgegeben. Man erhält also
DATA: lo_p1 TYPE REF TO zdp_cl_ptype_konptype1. mit jeder Referenz auf ein Objekt das gleiche Objekt, ohne dass das
DATA: lo_c1 TYPE REF TO zdp_cl_ptype_konptype1.
ursprüngliche Objekt dazu verändert wurde.
DATA: lv_id TYPE string.
Der Nachteil des Prototype Patterns ist, dass die Kopierfunktion für Aufwand bei
Start-Methode Um den ABAP-Report ZDP_AR_ERZ_PROTOTYPE ausführen zu können,
jedes einzelne Objekt implementiert werden muss. So ist es zwar komplexen
sehen wir in Listing 3.21 aufgeführte Codezeilen im ABAP-Report Objekten
sehr schnell und einfach möglich, das Entwurfsmuster bei einzelnen
vor.
Objekten umzusetzen, bei Objekten mit sehr vielen und differieren-
REPORT zdp_ar_erz_prototype. den Unterklassen ist die Implementierung aber mit einem größeren
DATA lo_app TYPE REF TO zdp_cl_ptype_applikation.
Aufwand verbunden.
CREATE OBJECT lo_app.
lo_app->start( ).
106 107
Inhalt
Inhalt
Einleitung .................................................................................. 13
1 Einführung ............................................................... 17
3 Erzeugungsmuster ................................................... 63
7
Inhalt Inhalt
8 9
Inhalt Inhalt
10 11
Index
A B
ABAP Dictionary 49, 58, 59 Backlog 270, 272
ABAP Objects 46, 48 Beck, Kent 17, 19
Abnahmetest 267 Befehl 161, 307, 321, 336
Abstract Factory Pattern 64 kapseln 159
Adapter 313 Klasse 161
Adapter Pattern 28, 33, 109, 121, Befehlsmuster 씮 Command Pattern
146, 314, 330 Beispielanwendung 288
Agent 322 Benutzeroberfläche 301, 329
Aggregat 184, 185 Benutzeroberflächenelement 씮 UI-
Aggregation 25 Element
Agilität 269 Benutzertyp 291
Akteur 44 Beobachter-Muster 204
Aktion rückgängig machen 162 Berechtigungsobjekt 291, 345
Alexander, Christopher 17 Berechtigungsprüfung 311, 326
Algorithmus 223, 231 Berechtigungssteuerung 309, 336
Alias 188 Best Practices 20
ALV 119 Besucher-Muster 158, 240
Analysephase 258 BINARY SEARCH 62
Anforderung 265 Binding 296
Anforderungsspezifikation 씮 Lasten- BPMN 40
heft Bugfixing 274
Anti Pattern 22, 95 Builder Pattern 64, 66
Anwendungsentwurf 258 Burndown Chart 274
Anwendungsfalldiagramm 43 Business Key 322
Anwendungsklasse 75 Business Layer 262
Anwendungslog 372 BW-Hierarchie 132
Anwendungslogik 307
APPEND 61
Application Layer 262 C
Arbeitsfluss 283
Architektur 17, 261 Chain Pattern 359
Architekturmodell 259 Change Management,
Artefakt 272 evolutionäres 279
Assistentenklasse 115 Changing-Parameter 58
Assoziation 25 Class Builder 49, 65
Attribut 52 Client 68, 75, 160
Instanzattribut 52 Command Pattern 158, 159, 251,
internes 97 290, 336
Konstanzattribut 52 Command-Klasse 159, 321
statisches 52 Commitment 272
UML 41 Component-Controller 112, 300
Aufrufer 160 Composite Pattern 109, 130, 168,
Auftragsnummer 289, 315 181, 308, 342, 373
Ausführungsrichtung 57 Connector 314
Context-Mapping 301
379
Index Index
Controller 112, 300, 303, 307, 309, Entwurfsmuster (Forts.) GoF-Muster 19, 27 J
336 Voraussetzungen 22 Grobentwurf 258, 261
CREATE OBJECT 119 Entwurfsproblem 20 Java 47
Cunningham, Ward 17, 19 Erbauer Johnson, Ralph 18
Cursor 씮 Iterator Implementierung 72 H
Customizing-Tabelle 315 Klasse 67
konkreter 67 Hash-Algorithmus 61 K
Erbauermuster 씮 Builder Pattern Hash-Tabelle 61
D Ereignisbehandler 321 Helm, Richard 18 Kanban-Methode 279
Erweiterungsanforderung 264 Hibernate 53 Kanban-Tafel 281
Daily Scrum 277 Erweiterungskategorie 296 Hierarchy plus Input Process Kapsel-Entwurfsmuster 씮 Façade Pat-
Data Store Object 95 Erzeugungsmuster 25, 26, 63 Output 47 tern
Datenbankschicht 313 Erzeugungsprozess 66 HIPO 47 Klasse 49
Datenbankschlüssel 322 Exportparameter 58 Hook-Methode 232 abstrakte 42, 54
Datenbanktabelle 62, 329 Hüllenklasse 씮 Adapter Pattern Attribut 52
Datenbankzugriff 313 Diagrammdarstellung 41
Datensynchronität 101 F globale 49
Datentyp I Instanziierung 51
definieren 58 Fabrik-Entwurfsmuster 씮 Factory Pat- lokale 49
UML 43 tern iDoc 123
persistente 53, 349
Deadlock 223 Façade Pattern 143, 336 Impediment Backlog 271, 275, 277
statische 51
Design 266 abstrakte Klasse 145 Implementierung 266
UML 41
Design Pattern 씮 Entwurfsmuster eine Schnittstelle 145 Importparameter 51, 58, 64
Klassenakteur 322
Designphase 262 Inbound-Plug 304
Fachbereich 256 Klassendiagramm 41
Index 60, 322
Dialogbenutzer 291 Fachkonzept 씮 Lastenheft Klassenkonstruktor 51
Direktor 68, 75 Indirektionsstufe 156
Factory Pattern 63, 78, 90, 92, 239, Klassenmuster 25, 63
Domäne 58 Infrastrukturschicht 262
292 Klonen 103
Dreischichtenmodell 114 INITIAL SIZE 61
Factory-Klasse 79, 312 Kommando 159, 311
DRY-Prinzip 32 Injection 77
abstrakte 79, 81 Kompositionsansatz 26, 157
Instanz 49
konkrete 81 Kompositummuster 씮 Composite Pat-
Instanzattribut 52
Factory-Methode 79 tern
E Fehlerbehebung 274
Instanziierung 28
konkreter Erbauer 74
Instanzmethode 53
Feinentwurf 259 Konstante 32, 58
Earned-Value-Analyse 273 Integrationstest 266
Flaschenhalsprinzip 101 Konstanzattribut 52
Einschubmethode 232 Interface 54, 123, 187, 310, 312
Flexibilität 30 Konstruktionsprozess 씮 Erzeugungs-
Einzelstück-Entwurfsmuster 씮 Single- Fliegengewicht-Muster 182
Konstante 54
prozess
ton Pattern Typ 54
Flow-Prinzip 281 Konstruktor 51
Empfänger 160 Flyweight Pattern 182
Interpreter Pattern 157, 169
Kontext 295, 300
Endlosschleife 212 Iteration 184
Framework 18 Kontextobjekt 28
Entwicklungsansatz 18 Iterator 182, 184
Funktionsbaustein 299 Kontrollfluss 26, 157
Entwicklungsprojekt 255 externer 184
Funktionstest 266
Entwicklungsumfang 255 interner 184
Entwurfsmuster 18 Klasse 188 L
Gruppe 25 G konkreter 184
Historie 18 Iterator Pattern 158, 182 Lastenheft 258, 259, 262, 266
Katalog 28 Gamma, Erich 18 IT-Spezifikation 259, 266 Laufzeitänderung 26
Kategorie 25 Gang of Four 19 Layout
klassenbasiertes 63 Geschäftslogikschicht 312 flexible Steuerung 290
objektbasiertes 63 Getter-Methode 29 Manager 329
Typ 25 GoF 19 Steuerung 329
Übersicht 26 Lazy Loading 101
380 381
Index Index
382 383
Index
384
Wissen aus erster Hand.
Wir hoffen sehr, dass Ihnen diese Leseprobe gefallen hat. Sie dürfen sie gerne
empfehlen und weitergeben, allerdings nur vollständig mit allen Seiten. Bitte
beachten Sie, dass der Funktionsumfang dieser Leseprobe sowie ihre Darstel-
lung von der E-Book-Fassung des vorgestellten Buches abweichen können.
Nurgül Atilgan, Markus Straub
Diese Leseprobe ist in all ihren Teilen urheberrechtlich geschützt. Alle Nut-
Entwurfsmuster in ABAP zungs- und Verwertungsrechte liegen beim Autor und beim Verlag.
384 Seiten, gebunden, 2. Auflage 2015
69,90 Euro, ISBN 978-3-8362-3810-6 Teilen Sie Ihre Leseerfahrung mit uns!
www.sap-press.de/3881