模式 / 结构模式
image

type
  IImage = interface
    procedure Display;
  end;

  TRealImage = class(TInterfacedObject,
    IImage)
  private
    FFileName: string;
  public
    constructor Create(
      const AFileName: string);
    procedure Display;
  end;

  //proxy delays the heavy object
  //until it is really needed
  TImageProxy = class(TInterfacedObject,
    IImage)
  private
    FFileName: string;
    FReal: IImage;
  public
    constructor Create(
      const AFileName: string);
    procedure Display;
  end;

constructor TRealImage.Create(
  const AFileName: string);
begin
  FFileName := AFileName;
  WriteLn('loading ', FFileName);
end;

procedure TRealImage.Display;
begin
  WriteLn('display ', FFileName);
end;

constructor TImageProxy.Create(
  const AFileName: string);
begin
  FFileName := AFileName;
end;

procedure TImageProxy.Display;
begin
  if FReal = nil then
    FReal := TRealImage.Create(FFileName);
  FReal.Display;
end;

var
  Image: IImage;
begin
  Image := TImageProxy.Create('photo.png');
  WriteLn('proxy created, nothing loaded');

  Image.Display;
  //loading photo.png
  //display photo.png
end.