- 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;
Во время выполнения наше клиентское приложение создает экземпляр фабрики с конкретным классом, а затем использует абстрактный интерфейс. Части клиентского приложения, использующего фабрику, не должны знать, какой конкретный класс действительно используется.