Translate

segunda-feira, 5 de setembro de 2011

Exemplo de Padrão de Projeto Factory em Delphi

O exemplo será apresentado através de uma necessidade, retornar o nome de uma pessoa que pode ser (Cliente, Agência ou Vendedor).

Minha definição de Factory nesse exemplo seria passar a responsabilidade da criação do objeto TPessoa para outro objeto.

Essa unit é responsável pela classe base TPessoa na qual possui um método Nome no qual será implementado em outro momento.
unit Pessoa;

interface

type
  TPessoa = class
    function Nome: string; virtual; abstract;
  end;

implementation

end.

Essa unit PessoaCliente é responsável pela classe TPessoaCliente que herda da classe base TPessoa na qual implementará o método Nome, observe que ele irá mostrar o nome da classe e o nome da pessoa para facilitar o desenvolvimento.
unit PessoaCliente;

interface

uses
  Pessoa;

type
  TPessoaCliente = class(TPessoa)
    function Nome: string; override;
  end;

implementation

function TPessoaCliente.Nome: string;
begin
  Result := ClassName + ': Microsoft';
end;

end.

Essa unit PessoaVendedor é semelhante a da classe TPessoaCliente
unit PessoaVendedor;

interface

uses
  Pessoa;

type
  TPessoaVendedor = class(TPessoa)
  public
    function Nome: string; override;
  end;

implementation

function TPessoaVendedor.Nome: string;
begin
  Result := ClassName + ': Bruno';
end;

end.

Essa unit PessoaFactory é responsável por criar e devolver a instanciar do objeto de acordo com o parâmetro informado TTipoPessoa.
Observe que o retorno é do tipo base TPessoa, facilitando a ampliação para outras classes como, por exemplo, TUsuario.
unit PessoaFactory;

interface

uses
  Classes,
  Pessoa;

type
  TTipoPessoa = (tpCliente, tpAgencia, tpVendedor);

  // Simple Factory: Retorna apenas a instancia, diferente do Abstract que pode retornar vários métodos
  TPessoaFactory = class
  public
    function CriarPessoa(const ATipoPessoa: TTipoPessoa): TPessoa;
  end;

implementation

uses
  PessoaCliente,
  PessoaAgencia,
  PessoaVendedor;

function TPessoaFactory.CriarPessoa(const ATipoPessoa: TTipoPessoa): TPessoa;
begin
  Result := nil;
  case ATipoPessoa of
    tpCliente:
      Result := TPessoaCliente.Create;
    tpAgencia:
      Result := TPessoaAgencia.Create;
    tpVendedor:
      Result := TPessoaVendedor.Create;
  end;
end;

end.

A unit Principal só tem conhecimento da unit PessoaFactory, que cria e chama o método nome de acordo com o parâmetro informado.
procedure TFormPrincipal.ButtonListarPessoasClick(Sender: TObject);
var
  Pessoa: TPessoaFactory;
begin
  Pessoa := TPessoaFactory.Create;
  try
    Memo.Lines.Add(Pessoa.CriarPessoa(tpCliente).Nome);
    Memo.Lines.Add(Pessoa.CriarPessoa(tpAgencia).Nome);
    Memo.Lines.Add(Pessoa.CriarPessoa(tpVendedor).Nome);
  finally
    Pessoa.Free;
  end;
end;


Mais detalhes no repositório https://bitbucket.org/brunosanson/design-patterns-em-delphi/

Um comentário:

Administrador disse...
Este comentário foi removido por um administrador do blog.

Postar um comentário

Deixe seu comentário aqui.