Skip to content

Commit

Permalink
translation: Translate Factory pattern README to portuguese. (#2602)
Browse files Browse the repository at this point in the history
  • Loading branch information
mathbraga authored Oct 14, 2023
1 parent d247395 commit dd040ba
Showing 1 changed file with 141 additions and 0 deletions.
141 changes: 141 additions & 0 deletions localization/pt/factory/README.md
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/)

0 comments on commit dd040ba

Please sign in to comment.