Das Factory-Pattern

Wenn Sie mit der Verwendung von Interfaces vertraut sind und diese anwenden, um verschiedene Implementierungen einer Klasse einzusetzen, fehlt nur noch ein kleiner Schritt zur Entkopplung des aufrufenden Codes zu den genutzten Klassen. Dieser Beitrag zeigt, wie Sie das Factory-Pattern für die Erzeugung beliebiger Implementierungen einer Schnittstelle nutzen, ohne dass die aufrufende Prozedur einen Bezug zu dieser Implementierung hat.

Der Beitrag Schnittstellenvererbung (www.access-im-unternehmen.de/734) zeigt am Beispiel des Versands einer E-Mail, wie Sie eine Schnittstelle beziehungsweise ein Interface nutzen können, um eine von mehreren konkreten Implementierungen dieses Interfaces zu verwenden.

Der Aufbau des dortigen Beispiels besteht aus einer Interface-Klasse namens ISendMail, welche die in einer Implementierung der SendMail-Klasse zu verwendenden Elemente, also Eigenschaften und Methoden, vorgibt (s. Listing 1).

Listing 1: Beispiel für eine Interface-Klasse

Public Property Let Sender(strSender As String)
End Property
Public Property Let Recipient(strRecipient As String)
End Property
Public Property Let Subject(strSubject As String)
End Property
Public Property Let Body(strBody As String)
End Property
Public Function SendMail() As Boolean
End Function

Eine konkrete Implementierung sieht dann wie in Bild 1 aus. Es kann gleich mehrere Klassen dieser Art geben, zum Beispiel clsSendSMTPMail oder clsSendOutlookMail. Gründe dafür, mehrere gleichartige Implementierungen in ein Projekt einzubauen, gibt es viele: So können Sie beispielsweise eine Klasse zum Versenden von E-Mails via Outlook vorsehen, die immer dann eingesetzt wird, wenn auf dem Rechner, auf dem die Datenbankanwendung eingesetzt wird, Outlook vorhanden ist. Ist kein Outlook installiert, soll die E-Mail über den direkten Kontakt zum SMTP-Server verschickt werden, der beispielsweise mit den Methoden der WinSock-Klasse hergestellt werden kann.Die Outlook-Methode wäre jedoch zu bevorzugen, weil der Benutzer die versendeten Mails hier jederzeit im Ordner der gesendeten Objekte nachhalten könnte.

pic001.png

Bild 1: Implementierung einer Schnittstelle

Um die Verwendung der Klassen zu vereinfachen, nutzen wir beispielsweise eine Prozedur, die nur die Parameter für den Mail-Versand und die Angabe der Versandart erwartet. Diese deklariert alle möglichen Mail-Klassen und instanziert dann die jeweils benötigte (s. Listing 2).

Listing 2: Konkrete Instanzierung von E-Mail-Klassen

Public Sub MailVersenden(strAbsender As String, strEmpfaenger As String, strBetreff As String, _
        strInhalt As String, strVersandart As String)
    Dim objSendSMTPMail As clsSendSMTPMail
    Dim objSendOutlookMail As clsSendOutlookMail
    Select Case strVersandart
        Case "SMTP"
            Set objSendSMTPMail = New clsSendSMTPMail
            With objSendSMTPMail
                .Sender = strAbsender
                ''... weitere Zugriffe auf die Klasse
            End With
        Case "Outlook"
            Set objSendOutlookMail = New clsSendOutlookMail
            With objSendOutlookMail
                .Sender = strAbsender
                ''... weitere Zugriffe auf die Klasse
            End With
    End Select
End Sub

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar