порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне. Также известен под названием виртуальный конструктор.
Плюсы
позволяет сделать код создания объектов более универсальным, не привязываясь к конкретным классам, а оперируя лишь общим интерфейсом
позволяет установить связь между параллельными иерархиями классов
Минусы
необходимость создавать наследника создателя для каждого нового типа продукта
Применяемость
классу заранее известно, объекты каких подклассов ему нужно создавать
класс спроектирован так, чтобы объекты, которые он создает, специфицировались подклассами
класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя
Плюсы
Минусы
Применяемость
program FactoryMethod; uses SysUtils; type TProduct = class public procedure GetName: string; virtual; abstract; end; TConcreteProductA = class(TProduct) public function GetName: string; override; end; TConcreteProductB = class(TProduct) public function GetName: string; override; end; TCreator = class public function FactoryMethod: TProduct; virtual; abstract; end; TConcreteCreatorA = class(TCreator) public function FactoryMethod: TProduct; override; end; TConcreteCreatorB = class(TCreator) public function FactoryMethod: TProduct; override; end; function TConcreteCreatorA.FactoryMethod: TProduct; begin Result := TConcreteProductA.Create; end; function TConcreteCreatorB.FactoryMethod: TProduct; begin Result := TConcreteProductB.Create; end; var Creators: array[1..2] of TCreator; Product: TProduct; i: integer; begin Creators[1] := TConcreteCreatorA.Create; Creators[2] := TConcreteCreatorB.Create; for i := 1 to 2 do begin Product := Creators[i].FactoryMethod; writeln(Product.GetName()); Product.Free(); end; for i := 1 to 2 do Creators[i].Free; end.
Комментариев нет:
Отправить комментарий