â Definição
Factory Method Ă© um padrĂŁo criacional que define uma interface para criar objetos, mas permite que subclasses decidam qual classe instanciar. Ele promove flexibilidade e desacoplamento entre o cĂłdigo cliente e as classes concretas.
đĄ CenĂĄrio prĂĄtico
Imagine um sistema de notificaçÔes que pode enviar mensagens por Email, SMS ou Push. O tipo de notificação pode variar conforme a preferĂȘncia do usuĂĄrio ou o canal disponĂvel.
Com Factory Method, vocĂȘ pode criar notificaçÔes dinamicamente sem precisar alterar o cĂłdigo principal. Basta trocar a classe concreta da fĂĄbrica.
đŠ Estrutura de Projeto
src/
âââ Interfaces/
â âââ INotificacao.pas
âââ Tipos/
â âââ TEmail.pas
â âââ TSMS.pas
â âââ TPush.pas
âââ Factory/
â âââ TNotificacaoFactory.pas
âââ App/
âââ Main.pas
đ§Ș CĂłdigo Delphi
type
INotificacao = interface
procedure Enviar(msg: string);
end;
TEmail = class(TInterfacedObject, INotificacao)
procedure Enviar(msg: string);
end;
TSMS = class(TInterfacedObject, INotificacao)
procedure Enviar(msg: string);
end;
TNotificacaoFactory = class
class function Criar(tipo: string): INotificacao;
end;
procedure TEmail.Enviar(msg: string);
begin
ShowMessage('Email enviado: ' + msg);
end;
procedure TSMS.Enviar(msg: string);
begin
ShowMessage('SMS enviado: ' + msg);
end;
class function TNotificacaoFactory.Criar(tipo: string): INotificacao;
begin
if tipo = 'email' then
Result := TEmail.Create
else if tipo = 'sms' then
Result := TSMS.Create
else
raise Exception.Create('Tipo de notificação invålido');
end;
// Uso no cliente:
procedure TForm1.Button1Click(Sender: TObject);
var
notificacao: INotificacao;
begin
notificacao := TNotificacaoFactory.Criar('email');
notificacao.Enviar('OlĂĄ, Savio!');
end;
â Vantagens
- đ Permite trocar o tipo de objeto criado sem alterar o cĂłdigo cliente
- 𧩠Facilita a adição de novos tipos de notificaçÔes
- đ Reduz o acoplamento entre o sistema e as classes concretas
đ ConclusĂŁo
Factory Method Ă© como um balcĂŁo de atendimento: vocĂȘ pede o tipo de notificação e ele entrega a instĂąncia certa, sem vocĂȘ precisar saber como ela foi criada.