- 1. Beispiel
Dieses Muster ist ideal, wenn Sie Ihre Anwendung von der Implementierung konkreter Klassen isolieren möchten. Wenn Sie beispielsweise die VCL von Delphi über eine gemeinsame VCL für 16- und 32-Bit-Anwendungen legen möchten, können Sie mit einer abstrakten Fabrik als Basis beginnen.
Beispiel
Das folgende Beispiel verwendet abstrakte Factorys und zwei konkrete Factory-Klassen, um verschiedene Stile von UI-Komponenten zu implementieren. TOAbstractFactory ist eine Singleton-Klasse, da normalerweise eine Factory für die gesamte Anwendung verwendet werden soll.
TOAbstractFactory = class(TObject) public constructor Create; destructor Destroy; override; //abstract widget constructors function CreateSpeedButton(AOwner: TComponent): TSpeedButton; virtual; abstract; function CreateEdit(AOwner: TComponent): TEdit; virtual; abstract; function CreateLabel(AOwner: TComponent): TLabel; virtual; abstract; end;
TORedFactory und TOBlueFactory überschreiben die abstrakte Schnittstelle, um verschiedene Widget-Stile zu unterstützen.
TORedFactory = class(TOAbstractFactory) public //concrete widget constructors function CreateSpeedButton(AOwner: TComponent): TSpeedButton; override; function CreateEdit(AOwner: TComponent): TEdit; override; function CreateLabel(AOwner: TComponent): TLabel; override; end; TOBlueFactory = class(TOAbstractFactory) public //concrete widget constructors function CreateSpeedButton(AOwner: TComponent): TSpeedButton; override; function CreateEdit(AOwner: TComponent): TEdit; override; function CreateLabel(AOwner: TComponent): TLabel; override; end;
Zur Laufzeit instanziiert unsere Clientanwendung die Factory mit einer konkreten Klasse und verwendet dann die abstrakte Schnittstelle. Die Teile der Client-Anwendung, die die Factory verwenden, müssen nicht wissen, welche bestimmte Klasse tatsächlich verwendet wird.