Hallo Blup,
vielen Dank für die Anregung.
Da es sich aber irgendwie falsch anfühlt, dass die HardwareAnsteuerungsFactory sowohl darüber entscheidet, welche Art von Ansteuerung verwendet wird, als auch die Waschmaschinen kennt und erzeugt, habe ich die Register-Methode in eine eigene WaschmaschinenFactory ausgelagert.
Es erscheint mir noch flexibler zu sein.
Noch ein bisschen unzufrieden bin ich mit dem Punkt, den der Günther erwähnt hat.
Ich veranlasse das Erzeugen im AfterConstruction des Waschsalons und bin damit jeder
Exception schutzlos ausgeliefert.
Es wäre wohl besser dem Befehl des Erzeugens eine Ebene höher explizit auszuführen.
Hier im Beispiel also in der procedure Main nach dem Erzeugen des Waschsalons.
Was denkt ihr?
Im Anhang der aktuelle Stand.
Delphi-Quellcode:
IWaschsalon = interface
['{240F248A-E379-44B3-ADBA-B08B3DE26567}']
function GibtWaschmaschineMitDerNummer(WaschmaschinenNummer : Integer) : IWaschmaschine;
function GetCount: Integer;
function GetMaxWaschmaschinen : Integer;
procedure RegisterWaschmaschine(const AWaschmaschine: IWaschmaschine);
property MaxWaschmaschinen : Integer read GetMaxWaschmaschinen;
property Count : Integer read GetCount;
end;
...
TWaschmaschinenFactory = class abstract
class procedure RegisterWaschmaschinen(const AWaschsalon: IWaschsalon);
end;
...
class procedure TWaschmaschinenFactory.RegisterWaschmaschinen(const AWaschsalon: IWaschsalon);
var
Waschmaschine: IWaschmaschine;
HardwareAnsteuerung : IHardwareAnsteuerung;
I : Integer;
begin
THardwareAnsteuerungFactory.GetHardwareAnsteuerung(HardwareAnsteuerung);
for I := 0 to AWaschsalon.MaxWaschmaschinen - 1 do
begin
Waschmaschine := TWaschmaschine.Create(HardwareAnsteuerung);
AWaschsalon.RegisterWaschmaschine(Waschmaschine);
end;
end;
...
procedure TWaschsalon.AfterConstruction;
begin
inherited;
FWaschmaschinenListe := TList<IWaschmaschine>.Create;
FülleWaschmaschinenListe;
end;
...
procedure TWaschsalon.FülleWaschmaschinenListe;
begin
TWaschmaschinenFactory.RegisterWaschmaschinen(Self);
end;