forked from leandro-costa/blog-material-aula-template
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #8 from AmandaSerpa/master
Object Pool
- Loading branch information
Showing
2 changed files
with
334 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |