Порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целый группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы. Затем пишутся наследующие от него классы, реализующие этот интерфейс.
Плюсы
изолирует конкретные классы
упрощает замену семейств продуктов
гарантирует сочетаемость продуктов
Минусы
сложно добавить поддержку нового вида продуктов
Применяемость
система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты
входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнение этого ограничения
система должна конфигурироваться одним из семейств составляющих ее объектов
требуется предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию
Плюсы
Минусы
Применяемость
program AbstractFactory; uses SysUtils; type ICar = class public procedure PrintName(); virtual; abstract; end; Ford = class(ICar) public procedure PrintName(); override; end; Toyota = class(ICar) public procedure PrintName(); override; end; IEngine = class public procedure PrintPower(); virtual; abstract; end; FordEngine = class(IEngine) public procedure PrintPower(); override; end; ToyotaEngine = class(IEngine) public procedure PrintPower(); override; end; ICarFactory = class public function CreateCar(): ICar; virtual; abstract; function CreateEngine(): IEngine; virtual; abstract; end; FordFactory = class(ICarFactory) public function CreateCar(): ICar; override; function CreateEngine(): IEngine; override; end; ToyotaFactory = class(ICarFactory) public function CreateCar(): ICar; override; function CreateEngine(): IEngine; override; end; function FordFactory.CreateCar: ICar; begin Result := Ford.Create; end; function FordFactory.CreateEngine: IEngine; begin Result := FordEngine.Create; end; function ToyotaFactory.CreateCar: ICar; begin Result := Toyota.Create; end; function ToyotaFactory.CreateEngine: IEngine; begin Result := ToyotaEngine.Create; end; procedure use(f: ICarFactory); var c: ICar; e: IEngine; begin c := f.CreateCar(); e := f.CreateEngine(); c.PrintName(); e.PrintPower(); c.Free(); e.Free(); end; var aToyotaFactory: ToyotaFactory; aFordFactory: FordFactory; begin aToyotaFactory := ToyotaFactory.Create; aFordFactory := FordFactory.Create; use(aToyotaFactory); use(aFordFactory); aToyotaFactory.Free(); aFordFactory.Free(); end;
Комментариев нет:
Отправить комментарий