Ok, statische Klassenvariablen gibt es ja eigentlich nicht in Delphi. Natürlich ist deine Variable, die du hier hochzählst wiederum global und das lässt sich (wie hier schon gesagt wurde) einfach vermeiden.
Was ich meinte noch mal als Delphi Code
Delphi-Quellcode:
type
TFoo = class(TObject)
private
FId : Cardinal;
...
public
constructor create(const Id : Cardinal);
property Id : Cardinal read FId;
end;
constructor TFoo.Create(const Id : Cardinal);
begin
inherited create;
self.Id := Id;
end;
Delphi-Quellcode:
type
TFooFactory = class(TObject)
private
id : Cardinal;
InstanceList : TFooList;
public
constructor create;
destructor destroy; override;
function getFooInstance : TFoo;
end;
constructor TFooFactory.Create;
begin
inherited create;
self.id := 0;
self.InstanceList := TFooList.Create;
end;
destructor TFooFactory.Destroy;
begin
self.InstanceList.Free; // Achtung, hier müssen natürlich auch alle gespeicherten Instanzen aut. gelöscht werden
inherited destroy;
end;
function TFooFactory.getFooInstance : TFoo;
var buffer : TFoo;
begin
buffer := TFoo.Create(self.id);
inc(self.id);
self.InstanceList.Add(buffer);
end;
Wie man sieht, kann man also sehr leicht eine Liste im Private Bereich verwalten und
imho gehört sie auch genau dahin. Dies ist natürlich ein stark vereinfachtes Beispiel, aber es kann sehr leicht angepasst werden, so dass man dann die TFooList nur noch nach einem speziellen TFoo durchsucht.
Gruß Der Unwissende
[Edit]
Ach ja, wenn man die Nummern alle nur einmal vergeben möchte, übergreifend für mehr als einen möglichen Aufrufer, sollte man natürlich etwas threadsafe arbeiten. Ansonsten natürlich auch noch ein Singleton-Pattern auf die Factory anwenden, dann gibt es nur eine Instanz von dieser TFooFactory, die man bekommt und somit hat man dort auch wieder eine globale Eindeutigkeit der Ids. Allerdings kommt man beim Singleton Pattern (soviel ich weiß) nicht mehr um eine globale Variable herum.
[/Edit]