Como Implementar Design Patterns em TypeScript: Factory
O que é o Design Pattern Factory?
O padrão de projeto Factory é um padrão de projeto criacional que fornece uma interface para criar objetos, mas permite que as subclasses decidam qual classe instanciar. Ele encapsula a lógica de criação de objetos em um método de fábrica, fornecendo uma maneira centralizada de criar objetos sem expor os detalhes de instanciação ao cliente.
Os principais participantes do padrão Factory são:
Produto: É a interface ou classe abstrata que define a interface comum para os objetos que o método fábrica irá criar.
Produtos Concretos: São as classes que implementam ou estendem a interface ou classe Produto. Cada produto concreto representa um tipo específico de objeto que a fábrica pode criar.
Criador (Fábrica): É a classe ou método responsável por criar e retornar instâncias dos produtos concretos. Ele encapsula a lógica de criação de objetos e fornece uma interface comum para o cliente criar objetos.
As principais vantagens de usar o padrão Factory são:
Encapsulamento: O padrão Factory encapsula a lógica de criação do objeto em uma fábrica centralizada, ocultando os detalhes de instanciação do cliente. Isso aprimora a organização e a capacidade de manutenção do código.
Abstração: o código do cliente depende da interface ou classe abstrata do produto, em vez de implementações concretas. Isso promove acoplamento fraco e permite flexibilidade na troca ou adição de novas implementações de produtos.
Extensibilidade: O padrão Factory permite fácil extensão adicionando novas classes de produtos concretos e lógica de criação correspondente na fábrica. Ele fornece uma solução escalável para lidar com um conjunto crescente de tipos de produtos.
Desacoplamento: Ao delegar a responsabilidade da criação do objeto a uma fábrica, o código do cliente é desacoplado de classes específicas de produtos. Simplifica o código do cliente e reduz as dependências.
No geral, o padrão Factory fornece uma maneira de criar objetos por meio de uma fábrica centralizada, promovendo a reutilização, flexibilidade e capacidade de manutenção do código. É particularmente útil quando você tem vários tipos ou variações de produtos e deseja abstrair o processo de criação do objeto.
Como Implementar o Factory
Vamos considerar um exemplo de um aplicativo de mensagens em que os usuários podem enviar mensagens por meio de diferentes canais, como e-mail, SMS e mídia social. Nesse cenário, o padrão de design Factory pode ser aplicado para criar o remetente de mensagem apropriado com base no canal selecionado.
O padrão de projeto Factory fornece uma interface para criar objetos, mas permite que as subclasses decidam qual classe instanciar. Ele encapsula a lógica de criação do objeto em um método de fábrica, fornecendo flexibilidade e extensibilidade.
Veja como você pode aplicar o padrão Factory no TypeScript para o aplicativo de mensagens:
- Defina a interface do produto: crie uma interface chamada
MessageSender
que declare um método para enviar mensagens, comosendMessage()
.
interface MessageSender {
sendMessage(message: string): void;
}
2. Implemente os produtos concretos: crie classes que implementem a interface MessageSender
para cada canal de mensagens. Por exemplo, você pode ter classes como EmailSender
, SMSSender
e SocialMediaSender
. Cada classe fornecerá sua própria implementação do método sendMessage()
.
class EmailSender implements MessageSender {
sendMessage(message: string): void {
// Implement email sending logic here
console.log(`Sending email: ${message}`);
}
}
class SMSSender implements MessageSender {
sendMessage(message: string): void {
// Implement SMS sending logic here
console.log(`Sending SMS: ${message}`);
}
}
class SocialMediaSender implements MessageSender {
sendMessage(message: string): void {
// Implement social media sending logic here
console.log(`Sending social media message: ${message}`);
}
}
3. Implemente a Factory: crie uma classe de fábrica chamada MessageSenderFactory
que encapsula a lógica de criação e retorna o objeto MessageSender
apropriado com base no canal solicitado.
class MessageSenderFactory {
static createMessageSender(channel: string): MessageSender {
if (channel === 'email') {
return new EmailSender();
} else if (channel === 'sms') {
return new SMSSender();
} else if (channel === 'social') {
return new SocialMediaSender();
} else {
throw new Error('Invalid channel');
}
}
}
4. Agora, quando um usuário deseja enviar uma mensagem, você pode usar a fábrica para criar o objeto MessageSender
apropriado com base no canal selecionado.
const channel = 'email'; // Or any other channel
const message = 'Hello, World!';
const messageSender = MessageSenderFactory.createMessageSender(channel);
messageSender.sendMessage(message);
Ao utilizar o padrão Factory, você pode desacoplar o código do cliente das implementações específicas do remetente de mensagens e fornecer uma maneira centralizada de criar remetentes de mensagens com base no canal solicitado. Isso promove flexibilidade, capacidade de manutenção e separação de interesses em seu projeto.