Das Factory-Pattern wollte ich ihm auch vorschlagen, nur das endet letztendlich mit der beschriebenen Erweiterung des patterns auch in einer globalen Variable. Wo soll die Faktory sonst die Objekte verwalten?
Hier mal ein Beispiel einer typisierten ObjectList mit Erweiterung:
Delphi-Quellcode:
TTest = class
private
ID : Integer;
public
Text: string;
constructor Create(_ID: integer);
end;
TTestObjectList = class(TObjectList)
protected
function GetItem(Index: Integer): TTest;
procedure SetItem(Index: Integer; AItem: TTest);
public
function Add(AItem: TTest): Integer;
function Extract(Item: TTest): TTest;
function Remove(AItem: TTest): Integer;
function IndexOf(AItem: TTest): Integer;
procedure Insert(Index: Integer; AItem: TTest);
function First: TTest;
function Last: TTest;
property Items[Index: Integer]: TTest read GetItem write SetItem; default;
function GetItemById(_ID : Integer; _CreateIfNotExists : Boolean = true) : TTest;
end;
{ TTest }
constructor TTest.Create(_ID: integer);
begin
ID := _ID;
end;
{ TTestObjectList }
function TTestObjectList.Add(AItem: TTest): Integer;
begin Result := inherited Add(AItem); end;
function TTestObjectList.Extract(Item: TTest): TTest;
begin Result := TTest(inherited Extract(Item)); end;
function TTestObjectList.First: TTest;
begin Result := TTest(inherited First); end;
function TTestObjectList.GetItem(Index: Integer): TTest;
begin Result := TTest(inherited Items[Index]); end;
function TTestObjectList.IndexOf(AItem: TTest): Integer;
begin Result := inherited IndexOf(AItem); end;
procedure TTestObjectList.Insert(Index: Integer; AItem: TTest);
begin inherited Insert(Index, AItem); end;
function TTestObjectList.Last: TTest;
begin Result := TTest(inherited Last); end;
procedure TTestObjectList.SetItem(Index: Integer; AItem: TTest);
begin inherited Items[Index] := AItem; end;
function TTestObjectList.Remove(AItem: TTest): Integer;
begin Result := inherited Remove(AItem);end;
function TTestObjectList.GetItemById(_ID: Integer;
_CreateIfNotExists: Boolean): TTest;
var
i : Integer;
begin
Result := nil;
for i := 0 to Count-1 do
if Items[i].ID = _ID then
begin
Result := Items[i];
exit;
end;
if not _CreateIfNotExists then exit;
Result := TTest.Create(_ID);
Add(Result);
end;