Factory Module verwenden

By , 2. März 2014

Man stelle sich vor man hat eine Klasse namens „Fahrzeug“, abgeleitet von dem Interface im Artikel zuvor, und Sie möchten neue Objekt erstellen. Üblicherweise geschieht das in folgender Weise:

    Dim car1 As Fahrzeug
    Set car1 = New Fahrzeug
    With car1
        .iFahrzeug_Farbe = 255
        .iFahrzeug_Geschwindigkeit = 100
        .iFahrzeug_Richtung = "Gerade aus"
        .iFahrzeug_Fahren
    End With

Mit der Anweisung Set car1 = New Fahrzeug wird das Objekt „car1“ zwar erstellt, das Objekt ist aber komplett ‚leer‘. Erst in den nachfolgenden Zeilen wird das Objekt mit Daten belegt. D.H. zum Erstellungszeitpunkt des Objektes stehen alle Eigenschaften auf 0 bzw. auf vbNullString.

Wäre es nicht Cool wenn man, um beim obigen Beispiel zu bleiben, das Objekt so erstellen könnte:

    Dim car1 As Fahrzeug
    Set car1 = New Fahrzeug(255,100,"Gerade aus")

Diese Möglichkeit gibt es in VBA leider nicht, aber wir können uns behelfen mit einer sogenannten Factory.

Zuerst benötigen wir in der Klasse „Fahrzeug“ einen Ersatz für den Standard-Konstruktor. Dazu erstellen wir eine öffentliche Prozedur, welche alle beim Start benötigten Werte als Parameter verlangt. Diese Parameter-Werte werden in dieser Prozedur einfach den Privaten Variablen zugewiesen. Und so sieht diese Prozedur für obiges Beispiel aus:

Public Sub Init(ByVal Color As Long, ByVal Speed As Long, ByVal Direction As String)
    m_farbe = Color
    m_geschwindigkeit = Speed
    m_richtung = Direction
End Sub

Danach erstellen wir ein Klassenmodul und benennen es z.B. „Factory“. Darin steht folgender Code:

Public Function CreateCar(lColor As Long, lSpeed As Long, cDirection As String) As Fahrzeug
    Dim objFahrzeug As Fahrzeug
    Set objFahrzeug = New Fahrzeug

    objFahrzeug.Init Color:=lColor, Speed:=lSpeed, Direction:=cDirection
    Set CreateCar = objFahrzeug
End Function

D.H. die Factory -Prozedur ruft den künstlichen Konstruktor in der Klasse „Fahrzeug“ auf, und übergibt die Startwerte.
Diese Factory Klasse kann viele Factory-Prozeduren für die unterschiedlichsten Klassen beinhalten, man muss nicht immer eine neue Factory-Klasse erstellen.

Verwendung:
Kommen wir zum obigen Beispiel zurück. Was sich als erstes ändert ist die Deklaration der Factory. Diese kann in einem Modul Private oder Public declariert werden. Wichtig ist dass die Factory mit dem Schlüsselwort New deklariert wird, da sonst das Objekt nicht erstellt wird:

Private CarFactory As New Factory

Das Erstellen des Objektes erfolgt dann so:

    Dim car1 As Fahrzeug
    Set car1 = CarFactory.CreateCar(255, 120, "links")
    car1.iFahrzeug_Fahren
    Set car1 = Nothing

Zusammenfassung
Durch die Factory können Klassen unabhängig von ihrer jeweiligen Implementierung verwendet werden, d.h. Klasse und aufrufender Code sind voneinander entkoppelt, und VBA rückt wieder ein Stück weiter in Richtung Objektorientierte Entwicklung. Daneben gibt es aber noch einen Handfesten Vorteil, der es Wert ist, sich mit Factories zu beschäftigen:
Jedes mal wenn ein Objekt instanziert wird, werden auch mit den notwendigen Eigenschaften gesetzt – da die Parameter in der Factory ja Muss-Parameter sind.

Viel Spass beim Experimentieren mit Klassen, Interface, Factory und Co.
Wenn es die Zeit erlaubt werde ich in den nächsten Tagen mal ein komplett-Beispiel hochladen mit Interface und Factory.

Bis dahin
© 2014 Andreas Vogt

OfficeFolders theme by Themocracy