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;

Під час виконання наші клієнтські програми створює екземпляр фабрики з конкретним класом, а потім використовує абстрактний інтерфейс. Частини клієнтської програми, що використовує фабрику, не повинні знати, який конкретний клас дійсно використовується.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…