• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Knitter

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

4 mensagens neste tópico

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Convidado
Este tópico está fechado a novas respostas.