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:
Postar um comentário
Deixe seu comentário aqui.