🔒 Singleton
Garante que uma classe tenha apenas uma instância e fornece um ponto global de acesso a ela. Ideal para configurações, logs ou conexões únicas.
type
TConfig = class
private
class var FInstance: TConfig;
constructor Create;
public
class function GetInstance: TConfig;
procedure LoadSettings;
end;
class function TConfig.GetInstance: TConfig;
begin
if FInstance = nil then
FInstance := TConfig.Create;
Result := FInstance;
end;
🏭 Factory Method
Define uma interface para criar objetos, mas permite que subclasses decidam qual classe instanciar. Ótimo para sistemas com múltiplos tipos de notificações.
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;
TFactory = class
class function Criar(tipo: string): INotificacao;
end;
class function TFactory.Criar(tipo: string): INotificacao;
begin
if tipo = 'email' then
Result := TEmail.Create
else if tipo = 'sms' then
Result := TSMS.Create;
end;
🎨 Abstract Factory
Permite criar famílias de objetos relacionados sem especificar suas classes concretas. Ideal para sistemas com múltiplas interfaces (Windows, Mac).
type
IButton = interface
procedure Render;
end;
IGUIFactory = interface
function CriarBotao: IButton;
end;
TWindowsFactory = class(TInterfacedObject, IGUIFactory)
function CriarBotao: IButton;
end;
TMacFactory = class(TInterfacedObject, IGUIFactory)
function CriarBotao: IButton;
end;
🧱 Builder
Separa a construção de um objeto complexo da sua representação. Ideal para gerar relatórios, documentos ou interfaces passo a passo.
type
TRelatorioBuilder = class
procedure AdicionarCabecalho;
procedure AdicionarCorpo;
procedure AdicionarRodape;
function GetRelatorio: string;
end;
🧬 Prototype
Permite copiar objetos existentes sem depender de suas classes. Útil para duplicar configurações, formulários ou layouts.
type
ICloneable = interface
function Clone: TObject;
end;
TDocumento = class(TInterfacedObject, ICloneable)
Titulo: string;
function Clone: TObject;
end;
function TDocumento.Clone: TObject;
begin
Result := TDocumento.Create;
TDocumento(Result).Titulo := Self.Titulo;
end;