Прототип позволяет создавать объекты “по быстрому”, не прибегая к конструкторам и последующему, порой утомительному, заполнению свойств.
Мы просто создаем исходный объект прототипа, и используем его метод 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.
Статья, которая мне понравилась на тему прототипа, картинка ниже из этой статьи.