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.