Skip to content

Commit

Permalink
Merge pull request #8 from AmandaSerpa/master
Browse files Browse the repository at this point in the history
Object Pool
  • Loading branch information
leandro-costa authored Apr 27, 2023
2 parents be9d5a7 + 4018805 commit 766d3f5
Show file tree
Hide file tree
Showing 2 changed files with 334 additions and 4 deletions.
127 changes: 123 additions & 4 deletions bib/bib.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,134 @@
[^BACKES]: Linguagem C - Completa e Descomplicada Capa comum, 2018, André Backes

[^Pires]:Jackson Pires .O que é Programação Orientada a Objetos e porque você precisa saber!https://becode.com.br/programacao-orientada-a-objetos-poo/. (Acessado em 15/08/2019)

[^SOFFNER]: Algoritmos e programação em linguagem C, 2013, Renato Soffner
[^Tedesco]:Kennedy Tedesco. Linguagens e paradigmas de programação - Blog da TreinaWeb.https://www.treinaweb.com.br/blog/linguagens-e-paradigmas-de-programacao/. (Acessado em 07/08/2019).

[^Deitel]:P.D. DEITEL e H. Deitel.JAVA: como programar.Pearson Educación, 2016.ISBN: 9786073238038.

[^LAPASINI]: ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I - Professora Me. Gislaine Camila Lapasini Leal - Unicesumar.
[^Dornelles]:Nemora Dornelles.As 15 principais linguagens de programação do mundo! | Becode.https://becode.com.br/principais-linguagens-de-programacao/. (Acessado em 15/08/2019).


[^Oracle]:Oracle."Hello World!" for Microsoft Windows (The Java™Tutorials > Getting Started> The "Hello World!" Application).[https://docs.oracle.com/javase/tutorial/getStarted/cupojava/win32.html](https://docs.oracle.com/javase/tutorial/getStarted/cupojava/win32.html). (Acessado em 07/08/2019).

[^Santos]:R. Santos.Introdução à programação orientada a objetos usando Java. Campus, 2003.ISBN:9788535212068.

[^Forbellone]:Forbellone, A. and Eberspacher, H., 2000. Lógica De Programação. Sao Paulo: Makron Books.

[^Ascencio]: Ascencio, A. and Campos, E., 2008. Fundamentos Da Programação De Computadores. São Paulo: Pearson Prentice Hall.

[^Salvetti]: Salvetti, D. and Barbosa, L., 1998. Algoritmos. São Paulo: Makron Books.

[^Farrer]: Farrer, H., 1999. Algoritmos Estruturados. Rio de Janeiro: LTC Editora.

[^Manzano]: Manzano, J. and Oliveira, J., 2005. Algoritmos. 17th ed. São Paulo (SP): Érica.

[^GAMMA]: GAMMA, Erich. et al. Padrões de projetos: Soluções reutilizáveis de software orientados a objetos Bookman editora, 2009.

[^Alexander]: Alexander, Christopher. A pattern language: towns, buildings, construction. Oxford university press, 1977.

[^WikAntipadrao]: Antipadrão. [https://pt.wikipedia.org/wiki/Antipadr%C3%A3o](https://pt.wikipedia.org/wiki/Antipadr%C3%A3o). (Acessado em 15/03/2022)

[^RobsonSRP]:Robson Castilho. Princípio da Responsabilidade Única (SRP) [https://robsoncastilho.com.br/2013/02/06/principios-solid-principio-da-responsabilidade-unica-srp/](https://robsoncastilho.com.br/2013/02/06/principios-solid-principio-da-responsabilidade-unica-srp/). (Acessado em 15/03/2022)

[^RobsonOCP]:Robson Castilho. Princípio do Aberto/Fechado (OCP) [https://robsoncastilho.com.br/2013/02/23/principios-solid-principio-do-abertofechado-ocp/](https://robsoncastilho.com.br/2013/02/23/principios-solid-principio-do-abertofechado-ocp/). (Acessado em 15/03/2022)

[^JoaoRobertoSOLID]:João Roberto da Paixão.O que é SOLID: O guia completo para você entender os 5 princípios da POO.[https://medium.com/desenvolvendo-com-paixao/o-que-%C3%A9-solid-o-guia-completo-para-voc%C3%AA-entender-os-5-princ%C3%ADpios-da-poo-2b937b3fc530](https://medium.com/desenvolvendo-com-paixao/o-que-%C3%A9-solid-o-guia-completo-para-voc%C3%AA-entender-os-5-princ%C3%ADpios-da-poo-2b937b3fc530) (Acessado em 18/03/2022)


[^guru]:Prototype. Refactoring Guru. Disponível em: [https://refactoring.guru/pt-br/design-patterns/prototype](https://refactoring.guru/pt-br/design-patterns/prototype). Acesso em: 07 de abril de 2022.

[^K19]: K19. Design Patterns em Java. 2012


[^Ascencio]: Ascencio, A. and Campos, E., 2008. Fundamentos Da Programação De Computadores. São Paulo: Pearson Prentice Hall.

[^caelumoo]: Caelum. Java e Orientação a Objetos - Curso fj-11.

[^camel]: Oracle. Code Conventions for the Java Programming Language: 9. Naming Conventions [https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html](https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html) (Acessado em 17/07/2021)

[^Deitel]:P.D. DEITEL e H. Deitel.JAVA: como programar, 10a Edição.Pearson, 2016.


[^Dornelles]:Nemora Dornelles.As 15 principais linguagens de programação do mundo! | Becode. [https://becode.com.br/principais-linguagens-de-programacao/](https://becode.com.br/principais-linguagens-de-programacao/). (Acessado em 15/08/2019).

[^Farrer]: Farrer, H., 1999. Algoritmos Estruturados. Rio de Janeiro: LTC Editora.

[^Forbellone]:Forbellone, A. and Eberspacher, H., 2000. Lógica De Programação. Sao Paulo: Makron Books.

[^GAMMA]: GAMMA, Erich. et al. Padrões de projetos: Soluções reutilizáveis de software orientados a objetos Bookman editora, 2009.

[^java16]: Oracle. Oracle Announces Java 16 [https://www.oracle.com/news/announcement/oracle-announces-java-16-031621.html](https://www.oracle.com/news/announcement/oracle-announces-java-16-031621.html) (Acessado em 15/07/2021)

[^k19oo]: K19-Treinamentos. (2013). Orientação a Objetos em Java, 220.

[^Manzano]: Manzano, J. and Oliveira, J., 2005. Algoritmos. 17th ed. São Paulo (SP): Érica.

[^Oracle]:Oracle."Hello World!" for Microsoft Windows (The Java™Tutorials > Getting Started> The "Hello World!" Application). [https://docs.oracle.com/javase/tutorial/getStarted/cupojava/win32.html](https://docs.oracle.com/javase/tutorial/getStarted/cupojava/win32.html). (Acessado em 07/08/2019).

[^Pires]:Jackson Pires .O que é Programação Orientada a Objetos e porque você precisa saber! [https://becode.com.br/programacao-orientada-a-objetos-poo/](https://becode.com.br/programacao-orientada-a-objetos-poo/). (Acessado em 15/08/2019)

[^Salvetti]: Salvetti, D. and Barbosa, L., 1998. Algoritmos. São Paulo: Makron Books.

[^Santos]:R. Santos.Introdução à programação orientada a objetos usando Java. Campus, 2003.ISBN:9788535212068.

[^Takenami]: Takenami, Igor. Introdução a Programação Orientada a Objetos. Salvador. 2011. (Apostila).

[^Tedesco]:Kennedy Tedesco. Linguagens e paradigmas de programação - Blog da TreinaWeb. [https://www.treinaweb.com.br/blog/linguagens-e-paradigmas-de-programacao/](https://www.treinaweb.com.br/blog/linguagens-e-paradigmas-de-programacao/). (Acessado em 07/08/2019).

[^Bacala]:Bacalá, Sílvio. Página do Professor Sílvio Bacalá Júnior. [http://www.facom.ufu.br/~bacala/POO/](http://www.facom.ufu.br/~bacala/POO/)

[^UFF]: Leandro A. F. Fernandes, Marcos Lage, Isabel Rosseti. 2ª Lista de Exercícios Orientação a Objetos. Universidade Federal Fluminense, Instituto de Computação, Departamento de Ciência da Computação, Programação de Computadores II

[^Jenkov]:Jakob Jenkov. Tutorials for Software Developers and Technopreneurs! [http://tutorials.jenkov.com/](http://tutorials.jenkov.com/). (Acessado em 03/11/2021)


[^DevMediaEve]:Thiago. Trabalhando com eventos na GUI do Java [https://www.devmedia.com.br/trabalhando-com-eventos-na-gui-do-java/25898](https://www.devmedia.com.br/trabalhando-com-eventos-na-gui-do-java/25898). (Acessado em 23/09/2022)


[^DevMediaConv]:Conversões em Java [https://www.devmedia.com.br/conversoes-em-java/2695](https://www.devmedia.com.br/conversoes-em-java/2695). (Acessado em 05/10/2022)

[^AluraColl]: Java Collections: Dominando Listas, Sets e Mapas. [https://www.alura.com.br/conteudo/java-collections--amp](https://www.alura.com.br/conteudo/java-collections--amp). (Acessado em 21/10/2022)


[^ExercitandoUML]: Melo, Ana Cristina. Exercitando Modelagem em Uml. ISBN-10: 8574522546


[^IBM]:IBM Cloud Education. Arquitetura de três camadas (tiers). [https://www.ibm.com/br-pt/cloud/learn/three-tier-architecture](https://www.ibm.com/br-pt/cloud/learn/three-tier-architecture). (Acessado em 01/02/2023)



[^JakartaEE]:The Jakarta EE Tutorial. Distributed Multitiered Applications [https://eclipse-ee4j.github.io/jakartaee-tutorial/#distributed-multitiered-applications](https://eclipse-ee4j.github.io/jakartaee-tutorial/#distributed-multitiered-applications). (Acessado em 01/02/2023)


[^JAVAGUIDES]:Three Tier (Three Layer) Architecture in Spring MVC Web Application.[https://www.javaguides.net/2020/07/three-tier-three-layer-architecture-in-spring-mvc-web-application.html](https://www.javaguides.net/2020/07/three-tier-three-layer-architecture-in-spring-mvc-web-application.html). (Acessado em 02/02/2023)

[^IBMthree]:What is three-tier architecture?.[https://www.ibm.com/topics/three-tier-architecture](https://www.ibm.com/topics/three-tier-architecture). (Acessado em 02/02/2023)


[^STACKIFY_LSP]: Princípios de design SOLID explicados: o princípio de substituição de Liskov com exemplos de código. [https://stackify.com/solid-design-liskov-substitution-principle/](https://stackify.com/solid-design-liskov-substitution-principle/)

[^JACKHISTON]: The Interface Segregation Principle. [https://jackhiston.com/2017/8/3/the-interface-segregation-principle/](https://jackhiston.com/2017/8/3/the-interface-segregation-principle/)

[^MACORATTI_ISP]: Princípio Da Segregação da Interface(ISP). [https://www.macoratti.net/20/05/c_isp1.htm](https://www.macoratti.net/20/05/c_isp1.htm)


[^MACORATTI_DIP]: Princípio da Inversão da Dependência. [https://macoratti.net/20/05/c_invdep1.htm](https://macoratti.net/20/05/c_invdep1.htm)

[^SourceMaking]: Object Pool Design Pattern. [https://sourcemaking.com/design_patterns/object_pool]

[^ODesign]: Object Pool Pattern. [https://www.oodesign.com/object-pool-pattern]

[^BestPratice]: Best Practice Software Engineering - Object Pool. [http://best-practice-software-engineering.ifs.tuwien.ac.at/patterns/objectpool.html]

[^CsiUneb]: Object Pool - Padrões de Projeto. [http://www.csi.uneb.br/padroes_de_projetos/object_pool.html]

[^Microsoft]: Reutilização de objeto com Object Pool no ASP.NET Core. [https://learn.microsoft.com/pt-br/aspnet/core/performance/objectpool?view=aspnetcore-7.0]

[^MANZANO]: Manzano, J. and Oliveira, J., 2005. Algoritmos. 17th ed. São Paulo (SP): Érica.

[^GAMMA]: GAMMA, Erich. et al. Padrões de projetos: Soluções reutilizáveis de software orientados a objetos Bookman editora, 2009.

[^Shvets]: Shvets, Alexander. EBOOK Mergulho Nos Padrões de Projeto.

[^ProjectLombok]: Project Lombok [https://projectlombok.org/features/Builder](https://projectlombok.org/features/Builder) (Acessado em 24/04/2023)
[^ProjectLombok]: Project Lombok [https://projectlombok.org/features/Builder](https://projectlombok.org/features/Builder) (Acessado em 24/04/2023)

211 changes: 211 additions & 0 deletions posts/ObjectPool.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
---
icon: edit
date: 2023-04-20 20:10:00.00 -3
tag:
- Object Pool
---

# Object Pool

[^SourceMaking]
[^ODesign]
[^BestPratice]
[^CsiUneb]
[^Microsoft]

## Intenção

O Object Pool tem como objetivo reaproveitar objetos, criando pré-instancias de objetos que poderão ser solicitados a qualquer momento.

## Também conhecido como

Pool de Objetos

## Motivação

Por exemplo se trabalhamos com bancos de dados, o processo de criar uma conexão é uma operação cara e pode exigir muito tempo, isso pode vir a sobrecarregar o banco de dados, ou seja, abrir muitas conexões pode afetar o desempenho por diversos motivos, por isso nesse caso seria recomendado a utilização do padrão de projeto **object pool**, que já terá pools de conexões prontas, que poderão ser reutilizadas sempre que um cliente solicitar, sem ter a necessidade de destruir e criar uma nova.

<figure>

```plantuml
@startuml
class Connection{
+Connection (database: String)
}
class ConnectionImpl{
}
Connection ..> ConnectionImpl: usa
Connection --> ConnectionPool: pede pelo ConnectionImpl
class ConnectionPool{
-<Reusable> reusables
+acquireConnectionImpl()
+releaseConnectionImpl()
}
ConnectionImpl --o ConnectionPool
hide empty attributes
hide empty methods
@enduml
```
<figcaption>Exemplo Object Pool.</figcaption>
</figure>

Quando um cliente precisar consultar o banco de dados, ele poderá instanciar um novo objeto connection especificando o nome do banco de dados que irá chamar o método de consulta que deverá retornar um objeto, enquanto isso o pool executa as seguintes ações:
- Procura um objeto reutilizável disponível e caso seja encontrado será devolvido ao cliente.
- Se nenhum objeto reutilizável for encontrado, ele tenta criar um novo. Se esta ação for bem-sucedida, o novo objeto reutilizável será retornado ao cliente.
- Se o pool não conseguir criar um novo objeto reutilizável, ele aguardará até que um objeto reutilizável seja liberado.

**Connection** - Representa o objeto que é instanciado pelo cliente. Da perspectiva do cliente, este objeto é criado e manipula as operações do banco de dados, é o único objeto visível para o cliente. O cliente não sabe que usa algumas conexões compartilhadas.

**ConnectionImpl** - É o objeto que implementa as operações de banco de dados que são expostas por Connection para o cliente.

**ConnectionPool** - É o que gerencia as conexões com o banco de dados. Ele mantém uma lista de objetos ConnectionImpl e instancia novos objetos, se necessário.

Lembrando que o cliente é responsável por solicitar o objeto reutilizável, bem como liberá-lo para o pool. Caso esta ação não seja realizada o objeto reutilizável será perdido, sendo considerado indisponível pelo ResourcePool.


## Aplicabilidade

Use o padrão Object Pool quando:

- Possuir objetos com alto custo e/ou tempo de criação;
- Os objetos que estão sendo usados podem ser reaproveitados;
- Os objetos forem intânciados com muita frequência, ou seja, várias partes do seu aplicativo requerem os mesmos objetos em momentos diferentes.


## Estrutura

<figure>

```plantuml
@startuml
class Cliente{
}
class Reusable{
}
Cliente ..> Reusable: usa
Cliente --> ReusablePool: pede pelo Reusable
class ReusablePool{
-<Reusable> reusables
+acquireReusable()
+releaseReusable()
+setMaxPoolSize(maxSize : int)
}
Reusable --o ReusablePool
hide empty attributes
hide empty methods
@enduml
```

<figcaption>Estrutura Object Pool.</figcaption>
</figure>


## Participantes

- **Reusable** (ConnectionImpl)
- Instâncias dessa classe colaboram com outros objetos por um período de tempo limitado, onde serão compartilhados por vários clientes por um período de tempo limitado e então não são mais necessárias para essa colaboração
- **Cliente** (Connection)
- Instâncias dessa classe usam os obejtos reutilizaveis (Reusable Objects).
- **ReusablePool** (ConnectionPool)
- Instâncias dessa classes gerenciam os objetos reutilizáveis ​​para utilização pelos clientes, criando e manuseando uma pool de objetos.


## Colaborações

- O cliente interage com o ReusablePool, para solicitar através do método AcquireReusable() o objeto que deseja utilizar (reusable), o ReusablePool verifica se existe alguma intância do objeto disponivel na pool no momento, e caso tenha, devolve para o cliente e altera o status daquele objeto para "indisponível", assim ele tem o controle que aquele objeto não pode ser emprestado novamente, até que seja devolvido pelo cliente através do método releaseReusable(), no qual ele coloca o reusable (objeto que foi emprestado) novamente na pool e altera seu status para "disponivel" até o momento que for solicitado novamente.

## Consequências

O padrão Object Pool tem os seguintes benefícios e desvantagens:

- **Benefícios**

- Oferece um aumento no desempenho.
- Consegue gerenciar as conexões e fornece uma maneira de reutiliza-las e compartilha-las.
- Pode fornecer o limite para o número máximo de objetos que podem ser criados.
- Oferece a possibilidade de alterar o tamanho da pool

- **Desvantagens**

- Como existe um limite de objetos na pool, pode ocorrer falta de objetos disponiveis.
- Para que o objeto volte para a pool, o cliente que o estava utilizando, precisa libera-lo, caso não o faça o objeto será perdido e não voltará para a pool.
- Pode ocorrer falhas na politica de aquisição e criação dos recursos.
- A posibilidade de alterar o tamanho da pool também pode gerar alguns problemas, como destruir objetos que estão em uso (caso o tamanho da pool seja diminuido)

## Implementação







## Exemplo de código

<!-- um jogo de damas onde o tabuleiro tem espaços especiais, e caso uma peça pare em cima desse espaço, receberá alguma instrução do que deve ser feito, uma dessas instruções é ganhar uma peça que está no monte (caso aja alguma disponivel), outra intrução é devolver uma peça para o monte caso tenha pego alguma -->

```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;
}

public boolean getDisponibilidade() {
return this.disponivel;
}
}
```

```java
public class Monte {

private List<Peca> pool_de_pecas;

public Peca pegarPeca() {
// disponibiliza a peça para o cliente solicitado
}

public void liberarPeca() {
// o cliente devolve a peça, e ela volta para a lista
}

}
```
## Usos conhecidos

O ASP.NET Core utiliza o padrão de projeto **object pool** para fazer a reutilização de objetos. É utilizado uma pool de objetos em alguns locais para reutilizar instâncias de StringBuilder, que servem para alocar e gerenciar seus próprios buffers para armazenar dados de caracteres. A ASP.NET Core usa StringBuilder regularmente para implementar recursos, e reutilizá-los oferece um benefício de desempenho.


## Padrão relacionados

***Factory Method*** : O padrão Factory Method pode ser usado para encapsular a lógica de criação de objetos. No entanto, ele não os gerencia após sua criação, o padrão de object pool rastreia os objetos que ele cria.

***Singleton*** : Object Pools geralmente são implementados como Singletons.

## Referências

@include(../bib/bib.md)

0 comments on commit 766d3f5

Please sign in to comment.