GeeksforGeeks (Português)
É um padrão de design de criação que fala sobre a criação de um objeto. O padrão de design de fábrica diz que define uma interface (uma interface java ou uma classe abstrata) e permite que as subclasses decidam qual objeto instanciar. O método de fábrica na interface permite que uma classe adie a instanciação para uma ou mais subclasses concretas. Uma vez que esses padrões de design falam sobre instanciação de um objeto e, portanto, se enquadram na categoria de padrão de design criativo. Se notarmos o nome Método de fábrica, significa que existe um método que é uma fábrica e, em geral, as fábricas estão envolvidas com coisas criativas e aqui com isso um objeto está sendo criado. É uma das melhores maneiras de criar um objeto onde a lógica de criação do objeto fica oculta para o cliente. Agora, vamos dar uma olhada na implementação.
Implementação:
1. Defina um método de fábrica dentro de uma interface.
2. Deixe que a subclasse implemente o método de fábrica acima e decida qual objeto criar.
Em Java, os construtores não são polimórficos, mas ao permitir que a subclasse crie um objeto, estamos adicionando um comportamento polimórfico à instanciação. Resumindo, estamos tentando alcançar o Pseudo polimorfismo permitindo que a subclasse decida o que criar e, portanto, este método de fábrica também é chamado de
Construtor virtual. Vamos tentar implementá-lo com um problema em tempo real e alguns exercícios de codificação.
Declaração do problema:
Considere que queremos implementar um serviço de notificação por e-mail, SMS e notificação push. Vamos tentar implementar isso com a ajuda do padrão de design do método de fábrica. Primeiro, projetaremos um diagrama de classes UML para isso.
No diagrama de classes acima, temos uma interface chamada Notificação, e três classes concretas estão implementando a interface Notificação. Uma classe de fábrica NotificationFactory é criada para obter um objeto Notification. Vamos pular para a codificação agora.
Criar interface de notificação
public
interface
Notification {
void
notifyUser();
}
Nota – A interface acima também pode ser criada como uma classe abstrata.
Crie todas as classes de implementação
SMSNotification.java
public
class
SMSNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending an SMS notification"
);
}
}
EmailNotification.java
public
class
EmailNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending an e-mail notification"
);
}
}
PushNotification.java
public
class
PushNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending a push notification"
);
}
}
Crie uma classe de fábrica NotificationFactory.java para instanciar a classe concreta.
Agora vamos usar a classe de fábrica para criar e obter um objeto de classe concreta passando algumas informações.
public
class
NotificationService {
public
static
void
main(String args)
{
NotificationFactory notificationFactory =
new
NotificationFactory();
Notification notification = notificationFactory.createNotification(
"SMS"
);
notification.notifyUser();
}
}
Output : Sending an SMS notification
Exemplos em tempo real
Esse padrão de design tem sido amplamente usado no JDK, como o
1. O método getInstance () de java.util.Calendar, NumberFormat e ResourceBundle usa o padrão de design do método de fábrica.
2. Todas as classes de wrapper como Integer, Boolean etc, em Java usam este padrão para avaliar os valores usando o método valueOf ().
3. java.nio.charset.Charset.forName (), java.sql.DriverManager # getConnection (), java.net.URL.openConnection (), java.lang.Class.newInstance (), java.lang.Class.forName () são alguns dos outros exemplos em que o padrão de projeto do método de fábrica foi usado.
Conclusão
Até agora, aprendemos o que é o padrão de projeto do método de fábrica e como implementá-lo. Acredito que agora temos um bom entendimento das vantagens desse mecanismo de design.