From 71b43684384b4da347574153791d2fd451dd26ba Mon Sep 17 00:00:00 2001 From: Amanda <88412207+AmandaSerpa@users.noreply.github.com> Date: Wed, 3 May 2023 17:28:07 -0300 Subject: [PATCH] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20pagina=20object=20pool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- posts/ObjectPool.md | 80 +++++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 25 deletions(-) diff --git a/posts/ObjectPool.md b/posts/ObjectPool.md index 4915dce5..1ce4d18f 100644 --- a/posts/ObjectPool.md +++ b/posts/ObjectPool.md @@ -148,51 +148,81 @@ O padrão Object Pool tem os seguintes benefícios e desvantagens: ## Implementação +Uma ideia de uso do padrão de projeto object pool, poderia ser em um jogo de damas, onde existe a opção de recuperar peças que já foram perdida. Cada jogador possui o seu cemitério, onde ficam suas peças que foram "mortas" pelo seu adversario, em certo ponto do jogo é possivel recuperar algumas peças que se encontram no cemitério; +Para que não seja necessário criar novas instâncias sempre que um jogador puder recuperar uma peça do cemitério, podemos utilizar o padrão de projeto e deixar uma pool de peças já prontas para serem usadas quando for preciso. Ao termino do jogo, ou quando forem "mortas" novamente, todas as peças serão devolvidas a pool. - - - - - -## Exemplo de código - - +Abaixo podemos ver um exemplo de como ficariam as classes com a utilização do object pool: ```java public class Peca { private int idPeca; - private boolean disponivel; - public Peca(int idPeca) { - this.idPeca = idPeca; - this.disponivel = true; } +} +``` - public void setDisponibilidade(boolean disponibilidade) { - this.disponivel = disponibilidade; - } +```java +public class Cemiterio { + + private ArrayList disponiveisParaUso; + private ArrayList pecasDeVoltaAoJogo; - public boolean getDisponibilidade() { - return this.disponivel; + public Peca pegarPeca() { + if (disponiveisParaUso.isEmpty()) { + return null; + } + else { + pecasDeVoltaAoJogo.add(disponiveisParaUsos.get(0)); + disponiveisParaUso.remove(0); + return referencia_em_uso = pecasDeVoltaAoJogo.get(pecasDeVoltaAoJogo.size() - 1); + } + } + public void liberarPeca(Peca pecaDevolvida) { + pecasDeVoltaAoJogo.remove(0); + disponiveisParaUso.add(pecaDevolvida); } } ``` -```java -public class Monte { - private List pool_de_pecas; +## Exemplo de código - public Peca pegarPeca() { - // disponibiliza a peça para o cliente solicitado - } +Código generico de classes quando é utilizado o object pool. - public void liberarPeca() { - // o cliente devolve a peça, e ela volta para a lista +```java +public class Objeto { + + private int idObjeto; + //qualquer outros atributos que o objeto possua + public Objeto(int idObjeto) { + this.idObjeto = idObjeto; } +} +``` +```java +public class PoolDeObjeto { + + private ArrayList disponiveis; + private ArrayList emUso; + + public Objeto pegarObjeto() { + if (disponiveis.isEmpty()) { // ver se a lista está vazia, caso esteja retorna null + return null; + } + else { + emUso.add(disponiveis.get(0)); + disponiveis.remove(0); + return referencia_em_uso = emUso.get(emUso.size() - 1); // se a lista tem objetos disponiveis, retorna a referencia do objeto para o cliente + } + } + public void liberarObjeto(Objeto objetoDevolvido) { + emUso.remove(0); + disponiveis.add(objetoDevolvido); // o cliente devolve o objeto, e ele volta para a lista de disponiveis + + } } ``` ## Usos conhecidos