Главная » Delphi » Delphi 2006 – Шаблон Factory Method (Фабричный метод)

0

Фабричные методы развивают концепцию Абстрактной фабрики. Они позволяют создавать объекты самых разных классов, доступ к которым осуществляется через единый универсальный продуктовый интерфейс (рис. 7.4).

Рис. 7.4. Шаблон Фабричный метод в Дизайнере модели

Интерфейс IProduct используется в прикладной программе для доступа к стандартному набору возможностей объектов, которые реально, вполне возможно, представляют собой экземпляры самых разных классов. Допустим, этот интерфейс (он формируется автоматически добавлением к модели текущего шаблона) состоит из двух методов: устанавливающего значение некоторого поля и возвращающего это значение.

IProduct = interface

procedure SetFunc(d:integer); function GetFunc: integer; end;

Пусть у нас имеется два разных продуктовых класса: TConcreteProduct и TConcreteProduct2. У одного из них имеется поле f ieldl, а у другого — field2.

TConcreteProduct = class(TObject, IProduct) public var

field:integer;

constructor Create;

procedure SetFunc(d:integer); function GetFunc: integer;

end;

TConcreteProduct2 = class(TObject, IProduct) public var

field2:integer;

constructor Create; procedure SetFunc(d:integer); function GetFunc: integer;

end;

Обратите внимание, что внутренние структуры этих классов несколько различаются.

Их методы реализуем схожим образом.

function TConcreteProduct.GetFunc: integer; begin

Result := field end;

function TConcreteProduct2.GetFunc: integer; begin

Result := field2 end;

procedure TConcreteProduct.SetFunc(d:integer); begin

field := d; end;

procedure TConcreteProduct2.SetFunc(d:integer); begin

field2 := d; end;

constructor TConcreteProduct.Create; begin

inherited;

field := 100; end;

constructor TConcreteProduct2.Create; begin

inherited; field2 := 200; end;

Нам требуется обеспечить взаимодействие с экземплярами этих классов через единый интерфейс IProduct. Для этого в шаблоне имеется абстрактный класс Создатель.

TCreator = class abstract public

///< i s subrout ine>True</is subrout ine> procedure SomeOperation;

function FactoryMethod: IProduct; virtual; abstract;

end;

В нем нас интересует фабричный метод FactoryMethod, создающий нужный объект-продукт.

Как определить, в каком случае какой объект создавать? Для этого либо создается несколько конкретных классов-наследников класса TCreator (если вариантов продуктов немного), либо один такой класс, в который в качестве параметра передается запрос на создание экземпляра нужного класса.

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

function TConcreteCreator.FactoryMethod(id: integer): IProduct; begin

case id of

1:Result     := TConcreteProduct.Create();

2:Result    := TConcreteProduct2.Create(); end;

end;

Как правило, действия над объектами, доступ к которым возможен через универсальный интерфейс, также по большой части скрываются и выделяются в методы Создателя, например, так.

function TCreator.SomeOperation: Integer; var

Productl, Product2 :IProduct; begin // . . .

Productl := FactoryMethod(l); Product2 := FactoryMethod(2);

Result := Productl.GetFunc + Product2.GetFunc; // . . . end;

Обращение к данному методу из прикладной формы при нажатии на кнопку может быть, например, таким.

procedure TWinForm.Buttonl_Click(sender: System.Object; e: System.EventArgs);

var 1С: TConcreteCreator; begin

1С := TConcreteCreator.Create(); labell.Text := 1С.SomeOperation.ToString end;

В поле labell будет показано число 300. При этом прикладной разработчик не будет знать, что происходит внутри метода SomeOperation.

Бобровский С. И. Технологии Delphi 2006. Новые возможности. — СПб.: Питер, 2006. — 288 е.: ил.

По теме:

  • Комментарии