Порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целый группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется созданием абстрактного класса 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;
Комментариев нет:
Отправить комментарий