- 1. Пример
Этот шаблон идеален там, где вы хотите изолировать свое приложение от реализации конкретных классов. Например, если вы хотите наложить VCL Delphi на общий уровень VCL для 16 и 32-битных приложений, вы можете начать с абстрактной фабрики в качестве базы.
Пример
В следующем примере используются абстрактные фабрики и два конкретных фабричных класса для реализации различных стилей компонентов пользовательского интерфейса. TOAbstractFactory - это одноэлементный класс, поскольку мы обычно хотим, чтобы одна фабрика использовалась для всего приложения.
- 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 и TOBlueFactory переопределяют абстрактный интерфейс для поддержки различных стилей виджетов.
- 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;
Во время выполнения наше клиентское приложение создает экземпляр фабрики с конкретным классом, а затем использует абстрактный интерфейс. Части клиентского приложения, использующего фабрику, не должны знать, какой конкретный класс действительно используется.