-
-
Notifications
You must be signed in to change notification settings - Fork 26.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
translation: Translate Factory pattern README to portuguese. (#2602)
- Loading branch information
Showing
1 changed file
with
141 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
--- | ||
title: Factory | ||
category: Creational | ||
language: pt | ||
tag: | ||
- Gang of Four | ||
--- | ||
|
||
## Também conhecido como | ||
|
||
* Simple Factory | ||
* Static Factory Method | ||
|
||
## Propósito | ||
|
||
Fornecer um método estático encapsulado em uma classe conhecida como factory, para ocultar a lógica | ||
de implementação e fazer com que o código do cliente se preocupe apenas com sua utilização em vez de | ||
inicializar novos objetos. | ||
|
||
## Explicação | ||
|
||
Exemplo de mundo real | ||
|
||
> Imagine um alquimista que está prestes a fabricar moedas. O alquimista deve ser capaz de produzir | ||
> moedas de ouro e cobre, e a alternância entre a fabricação destas deve ser possível sem a necessidade | ||
> de modificar o código fonte. O padrão factory torna isso possível fornecendo um método construtor estático | ||
> que pode ser chamado com parâmetros relevantes. | ||
Wikipedia diz | ||
|
||
> Factory é um objeto para a criação de outros objetos - formalmente uma factory é uma função ou método | ||
> que retorna objetos de protótipos ou classes variadas. | ||
**Exemplo de programação** | ||
|
||
Temos uma interface `Coin` e duas implementações `GoldCoin` e `CopperCoin`. | ||
|
||
```java | ||
public interface Coin { | ||
String getDescription(); | ||
} | ||
|
||
public class GoldCoin implements Coin { | ||
|
||
static final String DESCRIPTION = "This is a gold coin."; | ||
|
||
@Override | ||
public String getDescription() { | ||
return DESCRIPTION; | ||
} | ||
} | ||
|
||
public class CopperCoin implements Coin { | ||
|
||
static final String DESCRIPTION = "This is a copper coin."; | ||
|
||
@Override | ||
public String getDescription() { | ||
return DESCRIPTION; | ||
} | ||
} | ||
``` | ||
|
||
O enum abaixo representa os tipos de moedas que suportamos (`GoldCoin` e `CopperCoin`). | ||
|
||
```java | ||
@RequiredArgsConstructor | ||
@Getter | ||
public enum CoinType { | ||
|
||
COPPER(CopperCoin::new), | ||
GOLD(GoldCoin::new); | ||
|
||
private final Supplier<Coin> constructor; | ||
} | ||
``` | ||
|
||
Então temos o método estático `getCoin` para criar objetos de moeda encapsulados na classe factory | ||
`CoinFactory`. | ||
|
||
```java | ||
public class CoinFactory { | ||
|
||
public static Coin getCoin(CoinType type) { | ||
return type.getConstructor().get(); | ||
} | ||
} | ||
``` | ||
|
||
Agora no código cliente podemos criar diferentes tipos de moedas usando a classe factory. | ||
|
||
```java | ||
LOGGER.info("The alchemist begins his work."); | ||
var coin1 = CoinFactory.getCoin(CoinType.COPPER); | ||
var coin2 = CoinFactory.getCoin(CoinType.GOLD); | ||
LOGGER.info(coin1.getDescription()); | ||
LOGGER.info(coin2.getDescription()); | ||
``` | ||
|
||
Saída do programa: | ||
|
||
```java | ||
The alchemist begins his work. | ||
This is a copper coin. | ||
This is a gold coin. | ||
``` | ||
|
||
## Diagrama de classes | ||
|
||
![alt text](./etc/factory.urm.png "Diagrama de classes do padrão Factory") | ||
|
||
## Aplicabilidade | ||
|
||
Utilize o padrão factory quando a preocupação é apenas em criar o objeto, e não como criar | ||
e gerenciá-lo. | ||
|
||
Prós | ||
|
||
* Permite manter a criação de todos os objetos em um só lugar e evita espalhar a palavra-chave 'new' pela base de código. | ||
* Permite escrever código desacoplado. Algumas de suas principais vantagens incluem uma melhor testabilidade, código fácil de entender, componentes substituíveis, escalabilidade e funcionalidades isoladas. | ||
|
||
Contras | ||
|
||
* O código se torna mais complicado do que deveria. | ||
|
||
## Usos conhecidos | ||
|
||
* [java.util.Calendar#getInstance()](https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#getInstance--) | ||
* [java.util.ResourceBundle#getBundle()](https://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html#getBundle-java.lang.String-) | ||
* [java.text.NumberFormat#getInstance()](https://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html#getInstance--) | ||
* [java.nio.charset.Charset#forName()](https://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html#forName-java.lang.String-) | ||
* [java.net.URLStreamHandlerFactory#createURLStreamHandler(String)](https://docs.oracle.com/javase/8/docs/api/java/net/URLStreamHandlerFactory.html) (retorna objetos singleton diferentes, dependendo do protocolo) | ||
* [java.util.EnumSet#of()](https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html#of(E)) | ||
* [javax.xml.bind.JAXBContext#createMarshaller()](https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXBContext.html#createMarshaller--) e outros métodos parecidos. | ||
|
||
## Padrões relacionados | ||
|
||
* [Factory Method](https://java-design-patterns.com/patterns/factory-method/) | ||
* [Factory Kit](https://java-design-patterns.com/patterns/factory-kit/) | ||
* [Abstract Factory](https://java-design-patterns.com/patterns/abstract-factory/) | ||
|