DesignPatterns. Prototype

Прототип позволяет создавать объекты “по быстрому”, не прибегая к конструкторам и последующему, порой утомительному, заполнению свойств.

Мы просто создаем исходный объект прототипа, и используем его метод Clone, копируя тем самым текущий объект сколько угодно раз. Копируя его все самые потаенные уголки (приватные поля). Что было бы не всегда возможно, при традиционном создании через конструкторы.

У нас просто есть некий исходный объект, от которого мы ответвляемся.

Также плюс этого подхода – минимальная иерархия при создании. Бывает, что это критично. Мы не наследуемся от ста тысяч предков. Не вызываем их бесконечных конструкторов. У нас просто есть один прототип.

Пример использования

program Prototype;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  uPrototype in 'uPrototype.pas';

var
  robotPrototype: TRobotPrototype;
  anotherRobot: TRobotPrototype;

begin
  try
    robotPrototype := TRobotPrototype.Create();
    // create another robot from prototype
    anotherRobot := robotPrototype.Clone();
    try
      anotherRobot.Id := 123;
      anotherRobot.Name := 'deep blue robot';
      Writeln(anotherRobot.ToString());
      Readln;
    finally
      robotPrototype.Free();
      anotherRobot.Free();
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Код прототипа

unit uPrototype;

interface

type
  TPrototype = class
  public
    function Clone(): TPrototype; virtual; abstract;
  end;

  TRobotPrototype = class(TPrototype)
    FId: integer;
    FName: string;
  public
    constructor Create();
    function Clone(): TRobotPrototype;
    function ToString: string; override;
    property Name: string read FName write FName;
    property Id: Integer read Fid write FId;
  end;

implementation

uses
  System.SysUtils;

{ TRobotPrototype }

function TRobotPrototype.Clone: TRobotPrototype;
begin
  Result := TRobotPrototype.Create();
end;

constructor TRobotPrototype.Create;
begin
  FId := -1;
  FName := 'DefaultRobotName';
end;

function TRobotPrototype.ToString: string;
begin
  Result := 'id = ' + FId.ToString + ' name = ' + FName;
end;

end.

Статья, которая мне понравилась на тему прототипа, картинка ниже из этой статьи.

This entry was posted in Без рубрики. Bookmark the permalink.