Ich denke in diesem Fall sollte sich TColorPalette eine FactoryMethode (TFunc<IColor>) vom DI-Container injizieren lassen. Diese kannst du dann bei jedem AddColor aufrufen.
Ich denke Lazy stellt genau eine Instanz bereit. Da du aber mehrere brauchst um deine Liste zu füllen, benötigst du die Methode um sie mehrfach aufzurufen.
Delphi-Quellcode:
type
IColor = interface;
TColor = class(TInterfacedObject, IColor)
End;
TColorPalette = class
private
fFactory: TFunc<IColor>;
fColors: IList<IColor>;
protected
public
constructor Create(const AFactory: TFunc<IColor>);
procedure AddColor;
End;
Constructor TColorPalette.Create(const AFactory: Lazy<IColor>);
begin
inherited Create;
fFactory := AFactory;
fColors := TCollections.CreateList<IColor>();
End;
procedure TColorPalette.AddColor;
begin
fColors.Add(fFactory());
end;
procedure RegisterColorService();
begin
GlobalContainer.RegisterType<TColor>.Implements<IColor>('default').AsTransient.AsDefault;
GlobalContainer.RegisterType<TColorPalette>;
GlobalContainer.Build;
end;