Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
yuro
Code: Alles auswählen.
CLASS lcl_auto DEFINITION CREATE PRIVATE FRIENDS lcl_auto_agent.
PUBLIC SECTION.
TYPES: ty_autotyp(20) TYPE c,
ty_tankfuellung TYPE i,
ty_verbrauch(3) TYPE p DECIMALS 2.
DATA: kennzeichen(10) TYPE c.
METHODS:constructor IMPORTING i_kennzeichen TYPE csequence
i_tankfuellung TYPE csequence
i_verbrauch TYPE csequence
i_autotyp TYPE csequence.
METHODS: drucke,
get_autotyp RETURNING VALUE(r_autotyp) TYPE ty_autotyp,
set_autotyp IMPORTING VALUE(i_autotyp) TYPE csequence,
get_tankfuellung RETURNING VALUE(r_tankfuellung) TYPE ty_tankfuellung,
set_tankfuellung IMPORTING VALUE(i_tankfuellung) TYPE csequence,
get_verbrauch RETURNING VALUE(r_verbrauch) TYPE ty_verbrauch,
set_verbrauch IMPORTING VALUE(i_verbrauch) TYPE csequence.
PRIVATE SECTION.
DATA: autotyp TYPE ty_autotyp,
tankfuellung TYPE ty_tankfuellung,
verbrauch TYPE ty_verbrauch.
ENDCLASS.
Code: Alles auswählen.
CLASS lcl_auto_agent DEFINITION.
PUBLIC SECTION.
METHODS: ausgabe RETURNING VALUE(oref) TYPE REF TO lcl_auto.
ENDCLASS.
Code: Alles auswählen.
CLASS lcl_auto_agent IMPLEMENTATION.
METHOD ausgabe.
CREATE OBJECT oref. //Hier kommt der Fehler: obligatorische Parameter ist nicht mit Werten versorgt.
ENDMETHOD.
ENDCLASS.
Code: Alles auswählen.
DATA: fahrzeug TYPE REF TO lcl_auto,
agent TYPE REF TO lcl_auto_agent.
CREATE OBJECT agent.
fahrzeug = agent->ausgabe( ).
fahrzeug->set_autotyp( 'Jaguar' ).
....
fahrzeug->get_autotyp( ).
....
fahrzeug->drucke( ).
Wenn ich mir die Methode FACTORY der Klasse CL_SALV_TABLE ansehe, wird dort genau DAS gemacht, was Du nicht als Factory Design Pattern verstehst!??!!?ralf.wenzel hat geschrieben:Bei Factory Methoden gibt es einen Dissenz zwischen zwei Gruppen. Instanziierung der Klasse auf "Private" und eine statische öffentliche Methode, die die Instanziierung übernimmt ist nicht dass, was ich unter einem Factory Design Pattern verstehe. Dein Ansatz geht viel mehr in die Richtung. Du hast eine Oberklasse (ich bleibe bei deinem Beispiel) AUTO und darunter diverse Unterklassen CABRIO, KOMBI, etc.
Statt nun die Unterklasse zu instanziieren, schreibst du eine Methode AUTO=>FACTORY( ), die anhand bestimmter Kriterien eines der Unterobjekte auswählt und dynamisch die Instanz bildet: CREATE OBJECT name TYPE (concrete_class). Bei mir sind das oft Customizingtabellen, in denen ich den konkreten Klassennamen auslese und das konkrete Objekt gebe ich als Returning-Parameter zurück. Der Aufrufer bekommt ein Objekt zurück, also MY_CAR =? AUTO=>FACTORY( )., ( deklariert mit DATA MY_CAR TYPE REF TO AUTO) ohne dass er vorher weiß, welchen Untertyp von AUTO er bekommt.
Bei mir ist diese Methode in der Regel Komponente der Oberklasse, weil ich sehr wenig mit abstrakten Klassen arbeite. Man kann, wenn man eine abstrakte Oberklasse AUTO hat, aber auch eine Agentenklasse dafür schreiben, was dann aber fast in Richtung Abstrakte Fabrik geht.
Habe ich das halbwegs verständlich erklärt?
Was nun? ===>ralf.wenzel hat geschrieben: Man muss aber abgrenzen zwischen einer einfachen Erzeugungsmethode (die ein Objekt instanziiert, das dem Aufrufer bekannt ist) und einer Fabrikmethode im Sinne der Gang of Four, die ein Objekt erzeugt, dessen konkrete Ausprägung der Aufrufer eben NICHT kennt, weil z. B. in der factory-Methode selbst durch Fallunterscheidung oder durch Customizing festgelegt wird, welches Unterobjekt nun genau erzeugt wird.
In dem von mir beschriebenen Fall wird aber eben erst IN der Factorymethode entschieden, welches konkrete Objekt instanziiert wird. Und erst DAS macht eine Methode zu einer Factor-Methode im Sinne des Factory Design Patterns.
Allein, dass man eine Methode "factory" nennt, macht sie nicht zur Factory-MethodeDarum nenne ich Erzeugungsmethoden zum Beispiel für Singleton/Multiton Design Patterns grundsätzlich "get_instance", um sie auch vom Namen her abzugrenzen und nicht so auf den Putz zu hauen.
Ich empfehle hierzu immer wieder gern DAS Standardwerk zum Thema Entwurfsmuster, das man aber auf englisch lesen sollte, die deutsche Übersetzung ist sinnentstellend schlecht.
Oder: Nicht alles, was etwas fabriziert (ein Objekt erzeugt) ist eine Fabrik.
ralf.wenzel hat geschrieben:eine statische öffentliche Methode, die die Instanziierung übernimmt ist nicht dass, was ich unter einem Factory Design Pattern verstehe.
ralf.wenzel hat geschrieben:Nicht ganz - in BEIDEN Fällen wird durch eine statische öffentliche Methode instanziiert.
Hier hätte das Wort "lediglich" an der mit * markierten Stelle wohl beim Verständnis geholfen. Du darfst aber nicht das Wichtige weglassen beim Zitieren:Unit605 hat geschrieben:Was nun? ===>ralf.wenzel hat geschrieben:eine statische öffentliche Methode, die * die Instanziierung übernimmt ist nicht dass, was ich unter einem Factory Design Pattern verstehe.ralf.wenzel hat geschrieben:Nicht ganz - in BEIDEN Fällen wird durch eine statische öffentliche Methode instanziiert.
Schon an der Schreibweise siehst du, dass es sich bei FACTORY um eine statische Methode handeln muss, zumal ich später schrieb:ralf.wenzel hat geschrieben:Statt nun die Unterklasse zu instanziieren, schreibst du eine Methode AUTO=>FACTORY( ), die anhand bestimmter Kriterien
Der Unterschied zwischen einer einfachen Erzeugungsmethode und einer Fabrikmethode ist, dass ich als Aufrufer gar nicht weiß, welche Art von Objekt mir zurückgeliefert wird. Lies einfach mal das Buch (von dem ich nicht verstehe, dass es Entwickler gibt, die das NICHT kennen), dann verstehst du, was ich meine.ralf.wenzel hat geschrieben:Das hätte ich komplett anders gemacht und habe das auch so geschrieben. Schon der Umstand, dass die Methode AUSGABE eine Instanzenmethode ist und keine statische, halte ich für den falschen Weg.
ralf.wenzel hat geschrieben:eine statische öffentliche Methode, die die Instanziierung übernimmt ist nicht dass, was ich unter einem Factory Design Pattern verstehe.
ralf.wenzel hat geschrieben:Schon an der Schreibweise siehst du, dass es sich bei FACTORY um eine statische Methode handeln muss,
Code: Alles auswählen.
CLASS lcl_ausgabe DEFINITION.
PUBLIC SECTION.
CLASS-METHODS main.
ENDCLASS.
CLASS lcl_ausgabe IMPLEMENTATION.
METHOD main.
DATA: fahrzeug TYPE REF TO lcl_auto,
agent TYPE REF TO lcl_auto_agent.
CREATE OBJECT agent.
fahrzeug = agent->ausgabe( ).
fahrzeug->set_autotyp( 'Jaguar' ).
fahrzeug->set_tankfuellung( '100' ).
fahrzeug->set_verbrauch( '15.34' ).
fahrzeug->kennzeichen( 'F-KP69' ).
fahrzeug->get_autotyp( ).
fahrzeug->get_tankfuellung( ).
fahrzeug->get_verbrauch( ).
fahrzeug->drucke( ).
ENDMETHOD.
ENDCLASS.