Jump to content

[RESOLVIDO] Como implementar o padrão de desenho Singleton em Delphi?


Recommended Posts

Posted

Boas,

Estou a desenvolver uma aplicação para a qual criei uma classe com todos os métodos reutilizáveis mas preciso que essa classe seja instânciada usando o padrão Singleton. Como é que poderei fazer isso em Delphi? Onde e como colocar a instância da classe?

Posted

Delphi Singleton

Como sabes um singleton é apenas uma classe com uma instância única, com acesso global.

Exemplo:

type
  TSingleton = class (TObject)

  private
    constructor CriarInstancia;
    class function AcederInstancia(Pedido: Integer): TSingleton;

  public
    constructor Create;
    destructor Destroy; override;
    class function Instancia: TSingleton;
    class procedure LibertarInstancia;
  end; 

//lança excepção se tentares criar uma instância do objecto sem utilizar o método Instancia
constructor TSingleton.Create;
begin
  inherited Create;
  raise Exception.CreateFmt('Aceda a esta classe pelo metodo Instancia', [ClassName]);
end;

destructor TSingleton.Destroy;
begin
  if AcederInstancia(0) = Self then AcederInstancia(2);
  inherited Destroy;
end;

//metodo privado, acedido apenas em AcederInstancia
constructor TSingleton.CriarInstancia;
begin
  inherited Create;
end;

//Em delphi não há conceito de variáveis static, como tal utilizamos uma [b]typed constant[/b]* para guardar a instancia única.
class function TSingleton.AcederInstancia(Pedido: Integer): TSingleton; const InstanciaUnica: TSingleton = nil;
begin
  case Request of
    0 : ;
    1 : if not Assigned(InstanciaUnica) then InstanciaUnica := CriarInstancia;
    2 : InstanciaUnica := nil;
  else
    raise Exception.CreateFmt('Pedido ilegal %d em AcederInstancia', [Pedido]);
  end;
  Result := InstanciaUnica;
end;


//Acede à instância da classe, e cria-la se não existir.
class function TSingleton.Instancia: TSingleton;
begin
  Result := AcederInstancia(1);
end;

//Liberta a instância, se esta existir
class procedure TSingleton.LibertarInstancia;
begin
  AcederInstancia(0).Free;
end;

*Typed Constant: http://delphi.about.com/od/beginners/a/typedconstant.htm

Para utilizar um singleton a partir de outra classe fazes algo do género:

  TSingleton.Instancia.FazerTorradas;

"You leave nothing but death and horror in your wake!""Now, that's not fair, sometimes there's fire too"

Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.