Evgenii Legotckoi
18 сентября 2018 г. 15:11

Пример - Абстрактная фабрика на Delphi

Содержание

Этот шаблон идеален там, где вы хотите изолировать свое приложение от реализации конкретных классов. Например, если вы хотите наложить VCL Delphi на общий уровень VCL для 16 и 32-битных приложений, вы можете начать с абстрактной фабрики в качестве базы.


Пример

В следующем примере используются абстрактные фабрики и два конкретных фабричных класса для реализации различных стилей компонентов пользовательского интерфейса. TOAbstractFactory - это одноэлементный класс, поскольку мы обычно хотим, чтобы одна фабрика использовалась для всего приложения.

  1. TOAbstractFactory = class(TObject)
  2. public
  3. constructor Create;
  4. destructor Destroy; override;
  5.  
  6. //abstract widget constructors
  7. function CreateSpeedButton(AOwner: TComponent): TSpeedButton; virtual; abstract;
  8. function CreateEdit(AOwner: TComponent): TEdit; virtual; abstract;
  9. function CreateLabel(AOwner: TComponent): TLabel; virtual; abstract;
  10. end;

TORedFactory и TOBlueFactory переопределяют абстрактный интерфейс для поддержки различных стилей виджетов.

  1. TORedFactory = class(TOAbstractFactory)
  2. public
  3. //concrete widget constructors
  4. function CreateSpeedButton(AOwner: TComponent): TSpeedButton; override;
  5. function CreateEdit(AOwner: TComponent): TEdit; override;
  6. function CreateLabel(AOwner: TComponent): TLabel; override;
  7. end;
  8.  
  9. TOBlueFactory = class(TOAbstractFactory)
  10. public
  11. //concrete widget constructors
  12. function CreateSpeedButton(AOwner: TComponent): TSpeedButton; override;
  13. function CreateEdit(AOwner: TComponent): TEdit; override;
  14. function CreateLabel(AOwner: TComponent): TLabel; override;
  15. end;

Во время выполнения наше клиентское приложение создает экземпляр фабрики с конкретным классом, а затем использует абстрактный интерфейс. Части клиентского приложения, использующего фабрику, не должны знать, какой конкретный класс действительно используется.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь