Knitter Posted January 7, 2007 at 04:34 PM Report #75007 Posted January 7, 2007 at 04:34 PM 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?
benny Posted January 11, 2007 at 02:24 PM Report #75715 Posted January 11, 2007 at 02:24 PM Tens pm. Cumps
Kyu Posted January 11, 2007 at 03:38 PM Report #75728 Posted January 11, 2007 at 03:38 PM 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"
Knitter Posted January 11, 2007 at 05:05 PM Author Report #75732 Posted January 11, 2007 at 05:05 PM * Assunto Resolvido *
Recommended Posts