Exemplo 01 - Singleton, Builder e Factory Method
O exemplo a seguir demonstra a aplicação dos padrões de projeto Singleton, Builder e Factory Method em um cenário de desenvolvimento de um jogo de RPG.
Singleton: Game
Seção intitulada “Singleton: Game”O padrão Singleton garante que uma classe tenha apenas uma instância durante toda a execução.
Como foi implementado:
public class Game { private static Game instance; // instância única armazenada estaticamente
private Game() { } // construtor privado impede instanciação externa
public static Game getInstance() { if (instance == null) { instance = new Game(); // cria apenas na primeira chamada } return instance; // sempre retorna a mesma instância }}- O construtor é privado, impedindo
new Game()fora da classe - O método estático
getInstance()controla o acesso AudioManageré gerenciado peloGame, garantindo um único ponto de controle de áudio
Builder: CharacterBuilder
Seção intitulada “Builder: CharacterBuilder”O padrão Builder separa a construção de um objeto complexo da sua representação.
Como foi implementado:
public class CharacterBuilder { private int level; private String name; // outros atributos...
public CharacterBuilder setName(String name) { this.name = name; return this; // retorna o próprio builder para encadeamento (fluent interface) }
public CharacterBuilder setLevel(int level) { this.level = level; return this; }
public Character build() { return new Character(name, level, ...); // monta o objeto final }
public BarbarianCharacter buildBarbarian() { return new BarbarianCharacter(name, level, ...); }
public MageCharacter buildMage() { return new MageCharacter(name, level, ...); }}- Permite criar
Character,BarbarianCharacterouMageCharactercom a mesma interface de configuração - Usa Fluent Interface para encadear chamadas:
.setName("Hero").setLevel(5).build() - Evita construtores com muitos parâmetros
Factory: CharacterFactory
Seção intitulada “Factory: CharacterFactory”O padrão Factory delega a responsabilidade de criação de objetos para uma classe especializada.
Como foi implementado:
public class CharacterFactory { private String type;
public Character createCharacter(String name, int level) { CharacterBuilder builder = new CharacterBuilder() .setName(name) .setLevel(level);
switch (type) { case "barbarian": return builder.buildBarbarian(); // delega ao Builder case "mage": return builder.buildMage(); default: return builder.build(); } }}- Recebe o tipo do personagem e decide qual classe instanciar
- Combina com o Builder: a Factory usa o Builder internamente para montar os personagens
- O cliente não precisa saber qual classe concreta está sendo criada
Como os Padrões se Relacionam
Seção intitulada “Como os Padrões se Relacionam”Game (Singleton) └── AudioManager
CharacterFactory (Factory) └── CharacterBuilder (Builder) ├── Character ├── BarbarianCharacter └── MageCharacter
Level └── Lista de Characters criados pela Factory| Padrão | Problema que resolve | Como seria sem o padrão |
|---|---|---|
| Singleton | Garante um único Game e AudioManager | Múltiplas instâncias poderiam causar conflitos e inconsistências |
| Builder | Simplifica a criação de personagens com múltiplos atributos | Construtores complexos ou muitos parâmetros opcionais |
| Factory | Centraliza a lógica de qual tipo de personagem criar | Código cliente precisaria conhecer as classes concretas e instanciá-las diretamente |