Pular para o conteúdo

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.


O padrão Singleton garante que uma classe tenha apenas uma instância durante toda a execução.

Como foi implementado:

Game.java
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 pelo Game, garantindo um único ponto de controle de áudio

O padrão Builder separa a construção de um objeto complexo da sua representação.

Como foi implementado:

CharacterBuilder.java
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, BarbarianCharacter ou MageCharacter com a mesma interface de configuração
  • Usa Fluent Interface para encadear chamadas: .setName("Hero").setLevel(5).build()
  • Evita construtores com muitos parâmetros

O padrão Factory delega a responsabilidade de criação de objetos para uma classe especializada.

Como foi implementado:

CharacterFactory.java
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

Game (Singleton)
└── AudioManager
CharacterFactory (Factory)
└── CharacterBuilder (Builder)
├── Character
├── BarbarianCharacter
└── MageCharacter
Level
└── Lista de Characters criados pela Factory
PadrãoProblema que resolveComo seria sem o padrão
SingletonGarante um único Game e AudioManagerMúltiplas instâncias poderiam causar conflitos e inconsistências
BuilderSimplifica a criação de personagens com múltiplos atributosConstrutores complexos ou muitos parâmetros opcionais
FactoryCentraliza a lógica de qual tipo de personagem criarCódigo cliente precisaria conhecer as classes concretas e instanciá-las diretamente