From 791b0b0066e53c3c16e00dae055197c7c9b37aa3 Mon Sep 17 00:00:00 2001
From: Amanda <88412207+AmandaSerpa@users.noreply.github.com>
Date: Wed, 26 Apr 2023 21:12:46 -0300
Subject: [PATCH] Object Pool
---
bib/bib.md | 123 +++++++++++++++++++++++++-
posts/ObjectPool.md | 211 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 330 insertions(+), 4 deletions(-)
create mode 100644 posts/ObjectPool.md
diff --git a/bib/bib.md b/bib/bib.md
index a43ea3a7..dbd6f7d7 100644
--- a/bib/bib.md
+++ b/bib/bib.md
@@ -1,9 +1,124 @@
-[^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).
-[^MANZANO]: Manzano, J. and Oliveira, J., 2005. Algoritmos. 17th ed. São Paulo (SP): Érica.
\ No newline at end of file
+[^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]
\ No newline at end of file
diff --git a/posts/ObjectPool.md b/posts/ObjectPool.md
new file mode 100644
index 00000000..4915dce5
--- /dev/null
+++ b/posts/ObjectPool.md
@@ -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.
+
+
+
+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
+
+
+
+
+## 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
+
+
+
+```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 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)
\ No newline at end of file