Nesses primeiros posts eu vou escrever um pouco sobre algumas padrões de desenvolvimento (Design Patterns ) que considero importante, a primeira será Singleton.
Na engenharia de software, o padrão de desenvolvimento (Design Pattern) Singleton é um padrão de projeto que restringe a instanciação de uma classe para um objeto. Isso se torna bem útil quando um objeto é necessário para coordenar as ações em todo o sistema.
Quando necessitamos de somente uma instância da classe?
Por exemplo, uma classe de conexão com banco de dados, vamos supor que você terá que chamar diversas vezes a conexão com o banco de dados em um código na mesma execução, se você instanciar toda vez a classe de banco, haverá grande perda de desempenho, assim usando o padrão Singleton, é garantida que nesta execução será instanciada a classe somente uma vez.
Então como saber se uma classe é um Singleton?
Simplesmente obtenha várias vezes a instancia e compare com as anteriores. A classe não é singleton se existir pelo menos uma que não seja igual, a forma de comparar dois objetos a e b tal que a = b é falso.
O padrão singleton necessita que o objeto seja criado pela propria classe, no Delphi não conseguimos suprimir o construtor de TObject (Create), mas existe uma técnica para esconde-lo no auto completar (auto-complete);
Exemplo simples de implementação:
interface
type
TConexaoComBancoDeDados = class
strict private
class var fInstance: TConexaoComBancoDeDados;
class function GetInstance: TConexaoComBancoDeDados; static;
constructor Create; virtual; //simplesmente para não aparecer no auto-completar
public
class property Instance : TConexaoComBancoDeDados read GetInstance;
end;
implementation
{ TConexaoComBancoDeDados }
constructor TConexaoComBancoDeDados.Create;
begin
end;
class function TConexaoComBancoDeDados.GetInstance: TConexaoComBancoDeDados;
begin
if Assigned(fInstance) then
begin
fInstance := TConexaoComBancoDeDados.Create;
end;
Result := fInstance;
end;
Aqui um teste, pra comprovar o funcionamento:
procedure TForm1.btn1Click(Sender: TObject);
var
lConexoes01: TConexaoComBancoDeDados;
lConexoes02: TConexaoComBancoDeDados;
begin
//..Criando as conexões
lConexoes01 := TConexaoComBancoDeDados.Instance;
try
lConexoes02 := TConexaoComBancoDeDados.Instance;
try
// uma compração direta de objetos
if lConexoes01 = lConexoes02 then
begin
ShowMessage('Classe implementa Singleton');
end else begin
ShowMessage('Classe NÃO implementa Singleton');
end;
finally
lConexoes02.Free;
end;
finally
lConexoes01.Free;
end;
end;
Para conseguir perceber a diferença, modifique a método GetInstance da classe TConexaoComBancoDeDados:
class function TConexaoComBancoDeDados.GetInstance: TConexaoComBancoDeDados;
begin
{
if Assigned(fInstance) then
begin
fInstance := TConexaoComBancoDeDados.Create;
end;
Result := fInstance;
}
Result := TConexaoComBancoDeDados.Create;
end;
Há críticas ao uso do padrão Singleton, como alguns consideram que é uma má prática (anti-pattern), julgando que ele usado em demasia, introduz restrições desnecessárias em situações em que uma única instância de uma classe não é realmente necessário, e introduz estado global em um aplicativo. Eu particularmente não concordo.
Resumidamente, mostrei como é feito um Singleton em Delphi, em futuras postagens mostraremos ele sendo usado em "produção"..
Abrass
Nenhum comentário:
Postar um comentário