From 9a925d76093879127b0971fea9a19872d09c47e8 Mon Sep 17 00:00:00 2001 From: MateusPy Date: Mon, 22 Jul 2024 22:32:31 -0300 Subject: [PATCH 01/11] =?UTF-8?q?Adicionando=20Introdu=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pedro Lucas --- .../ChainsOfResponsibility.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/PadroesDeProjeto/ChainsOfResponsibility.md diff --git a/docs/PadroesDeProjeto/ChainsOfResponsibility.md b/docs/PadroesDeProjeto/ChainsOfResponsibility.md new file mode 100644 index 0000000..da60bca --- /dev/null +++ b/docs/PadroesDeProjeto/ChainsOfResponsibility.md @@ -0,0 +1,38 @@ +# Chain of Responsibility - GoF Comportamental + +## 1. Introdução + +O Chain of Responsibility é um padrão de projeto comportamental que permite que pedidos sejam enviados por uma cadeia de handlers (manipuladores). Cada handler na cadeia tem a oportunidade de processar o pedido ou passá-lo para o próximo handler. Este padrão promove o desacoplamento entre o remetente do pedido e seus receptores, facilitando a adição ou modificação de handlers sem impactar os demais componentes do sistema. + +## 2. Objetivo +No aplicativo My Market, um pedido precisa passar por várias etapas de validação e processamento antes de ser aprovado. Cada uma dessas etapas pode ser gerenciada por um módulo diferente do sistema. Por exemplo: + +- Verificação de Estoque: Primeira etapa onde o sistema verifica se o item solicitado está disponível em estoque. +- Validação de Pagamento: Após a verificação de estoque, o sistema valida as informações de pagamento do cliente. +- Aprovação do Gerente: Finalmente, o pedido pode necessitar de uma aprovação adicional por parte de um gerente, especialmente para transações de alto valor ou itens restritos. + +Cada uma dessas etapas é responsabilidade de um handler específico. O padrão Chain of Responsibility permite que o pedido seja passado sequencialmente por cada handler, onde cada um decide se processa o pedido ou o encaminha para o próximo handler. Isso promove uma estrutura flexível e modular, facilitando a manutenção e a expansão do sistema. + +## 3. Implementação +... +### 3.1. Diagrama UML +Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/). + +![image](https://github.com/user-attachments/assets/831707dd-34a5-410c-9df0-d27fb7a16c89) + +
Figura x: Desconto. Fonte: Guilherme Nishimura e Pedro Henrique
+ +### 3.2. Código + +x + + +## Referências + +> **Arquitetura e Desenho de Software - Aula GoFs Comportamentais**. Material de apoio em slides. Milene Serrano. + +## Versionamento + +| Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | +| :------: | :---: | :-----: | :----: | :----: | :-----: | +| 1.0 | Inicio da estrutura do documento | Guilherme Nishimura |x | 22/07/2023| x| From 7974a8f5fbe5c2b64d82161cfd5b02df392fb549 Mon Sep 17 00:00:00 2001 From: MateusPy Date: Mon, 22 Jul 2024 23:13:03 -0300 Subject: [PATCH 02/11] =?UTF-8?q?Adicionando=20Introdu=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pedro Lucas Co-authored-by: Thiago Vivan --- .../ChainsOfResponsibility.md | 97 ++++++++++++++++++- 1 file changed, 94 insertions(+), 3 deletions(-) diff --git a/docs/PadroesDeProjeto/ChainsOfResponsibility.md b/docs/PadroesDeProjeto/ChainsOfResponsibility.md index da60bca..bb2b2e3 100644 --- a/docs/PadroesDeProjeto/ChainsOfResponsibility.md +++ b/docs/PadroesDeProjeto/ChainsOfResponsibility.md @@ -20,11 +20,101 @@ Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com ![image](https://github.com/user-attachments/assets/831707dd-34a5-410c-9df0-d27fb7a16c89) -
Figura x: Desconto. Fonte: Guilherme Nishimura e Pedro Henrique
+
Figura 01: Desconto. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan
### 3.2. Código -x +```java +public interface Handler { + Handler setNext(Handler handler); + String handle(Request request); +} + +public abstract class BaseHandler implements Handler { + private Handler nextHandler; + + @Override + public Handler setNext(Handler handler) { + this.nextHandler = handler; + return handler; + } + + @Override + public String handle(Request request) { + if (this.nextHandler != null) { + return this.nextHandler.handle(request); + } + return null; + } +} + +public class EstoqueHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isEstoqueDisponivel()) { + System.out.println("Estoque verificado."); + return super.handle(request); + } else { + return "Pedido rejeitado: estoque insuficiente."; + } + } +} + +public class PagamentoHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isPagamentoValidado()) { + System.out.println("Pagamento validado."); + return super.handle(request); + } else { + return "Pedido rejeitado: pagamento não validado."; + } + } +} + +public class GerenteHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isAprovadoPeloGerente()) { + System.out.println("Aprovado pelo gerente."); + return super.handle(request); + } else { + return "Pedido rejeitado: não aprovado pelo gerente."; + } + } +} + +public class Request { + private boolean estoqueDisponivel; + private boolean pagamentoValidado; + private boolean aprovadoPeloGerente; + + public boolean isEstoqueDisponivel() { + return estoqueDisponivel; + } + + public void setEstoqueDisponivel(boolean estoqueDisponivel) { + this.estoqueDisponivel = estoqueDisponivel; + } + + public boolean isPagamentoValidado() { + return pagamentoValidado; + } + + public void setPagamentoValidado(boolean pagamentoValidado) { + this.pagamentoValidado = pagamentoValidado; + } + + public boolean isAprovadoPeloGerente() { + return aprovadoPeloGerente; + } + + public void setAprovadoPeloGerente(boolean aprovadoPeloGerente) { + this.aprovadoPeloGerente = aprovadoPeloGerente; + } +} +``` + ## Referências @@ -35,4 +125,5 @@ x | Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | | :------: | :---: | :-----: | :----: | :----: | :-----: | -| 1.0 | Inicio da estrutura do documento | Guilherme Nishimura |x | 22/07/2023| x| +| 1.0 | Inicio da estrutura do documento | Mateus Orlando, Pedro Lucas e Thiago Vivan | - | 22/07/2024 | x | +| 2.0 | Adição o código da implementação do GoF | Mateus Orlando, Pedro Lucas e Thiago Vivan | - | 22/07/2024 | x | From 16cc6ca943830a4679fd18bd2c0edd21c1cf0baa Mon Sep 17 00:00:00 2001 From: Mateus Orlando <98001933+MateusPy@users.noreply.github.com> Date: Mon, 22 Jul 2024 23:16:49 -0300 Subject: [PATCH 03/11] Adicionando Imagem do diagrama --- docs/PadroesDeProjeto/ChainsOfResponsibility.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/PadroesDeProjeto/ChainsOfResponsibility.md b/docs/PadroesDeProjeto/ChainsOfResponsibility.md index bb2b2e3..ff34912 100644 --- a/docs/PadroesDeProjeto/ChainsOfResponsibility.md +++ b/docs/PadroesDeProjeto/ChainsOfResponsibility.md @@ -18,9 +18,10 @@ Cada uma dessas etapas é responsabilidade de um handler específico. O padrão ### 3.1. Diagrama UML Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/). -![image](https://github.com/user-attachments/assets/831707dd-34a5-410c-9df0-d27fb7a16c89) +![image](https://github.com/user-attachments/assets/767e17d8-0009-4954-a945-230d875ed61e) -
Figura 01: Desconto. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan
+ +
Figura 01: Desconto. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
### 3.2. Código @@ -127,3 +128,4 @@ public class Request { | :------: | :---: | :-----: | :----: | :----: | :-----: | | 1.0 | Inicio da estrutura do documento | Mateus Orlando, Pedro Lucas e Thiago Vivan | - | 22/07/2024 | x | | 2.0 | Adição o código da implementação do GoF | Mateus Orlando, Pedro Lucas e Thiago Vivan | - | 22/07/2024 | x | +| 3.0 | Adição do Diagrama | Mateus Orlando, Pedro Lucas e Thiago Vivan | - | 22/07/2024 | x | From 2a7f58d12c73dc7d31464adea744b8b374b7ae29 Mon Sep 17 00:00:00 2001 From: MateusPy Date: Mon, 22 Jul 2024 23:13:03 -0300 Subject: [PATCH 04/11] =?UTF-8?q?Adicionando=20C=C3=B3digo=20Java=20que=20?= =?UTF-8?q?implenta=20o=20GoF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pedro Lucas Co-authored-by: Thiago Vivan --- .../ChainsOfResponsibility.md | 97 ++++++++++++++++++- 1 file changed, 94 insertions(+), 3 deletions(-) diff --git a/docs/PadroesDeProjeto/ChainsOfResponsibility.md b/docs/PadroesDeProjeto/ChainsOfResponsibility.md index da60bca..bb2b2e3 100644 --- a/docs/PadroesDeProjeto/ChainsOfResponsibility.md +++ b/docs/PadroesDeProjeto/ChainsOfResponsibility.md @@ -20,11 +20,101 @@ Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com ![image](https://github.com/user-attachments/assets/831707dd-34a5-410c-9df0-d27fb7a16c89) -
Figura x: Desconto. Fonte: Guilherme Nishimura e Pedro Henrique
+
Figura 01: Desconto. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan
### 3.2. Código -x +```java +public interface Handler { + Handler setNext(Handler handler); + String handle(Request request); +} + +public abstract class BaseHandler implements Handler { + private Handler nextHandler; + + @Override + public Handler setNext(Handler handler) { + this.nextHandler = handler; + return handler; + } + + @Override + public String handle(Request request) { + if (this.nextHandler != null) { + return this.nextHandler.handle(request); + } + return null; + } +} + +public class EstoqueHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isEstoqueDisponivel()) { + System.out.println("Estoque verificado."); + return super.handle(request); + } else { + return "Pedido rejeitado: estoque insuficiente."; + } + } +} + +public class PagamentoHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isPagamentoValidado()) { + System.out.println("Pagamento validado."); + return super.handle(request); + } else { + return "Pedido rejeitado: pagamento não validado."; + } + } +} + +public class GerenteHandler extends BaseHandler { + @Override + public String handle(Request request) { + if (request.isAprovadoPeloGerente()) { + System.out.println("Aprovado pelo gerente."); + return super.handle(request); + } else { + return "Pedido rejeitado: não aprovado pelo gerente."; + } + } +} + +public class Request { + private boolean estoqueDisponivel; + private boolean pagamentoValidado; + private boolean aprovadoPeloGerente; + + public boolean isEstoqueDisponivel() { + return estoqueDisponivel; + } + + public void setEstoqueDisponivel(boolean estoqueDisponivel) { + this.estoqueDisponivel = estoqueDisponivel; + } + + public boolean isPagamentoValidado() { + return pagamentoValidado; + } + + public void setPagamentoValidado(boolean pagamentoValidado) { + this.pagamentoValidado = pagamentoValidado; + } + + public boolean isAprovadoPeloGerente() { + return aprovadoPeloGerente; + } + + public void setAprovadoPeloGerente(boolean aprovadoPeloGerente) { + this.aprovadoPeloGerente = aprovadoPeloGerente; + } +} +``` + ## Referências @@ -35,4 +125,5 @@ x | Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | | :------: | :---: | :-----: | :----: | :----: | :-----: | -| 1.0 | Inicio da estrutura do documento | Guilherme Nishimura |x | 22/07/2023| x| +| 1.0 | Inicio da estrutura do documento | Mateus Orlando, Pedro Lucas e Thiago Vivan | - | 22/07/2024 | x | +| 2.0 | Adição o código da implementação do GoF | Mateus Orlando, Pedro Lucas e Thiago Vivan | - | 22/07/2024 | x | From 22b3aa561f08e64bd47850ee6fafdfb48c7ad10c Mon Sep 17 00:00:00 2001 From: MateusPy Date: Tue, 23 Jul 2024 11:30:24 -0300 Subject: [PATCH 05/11] =?UTF-8?q?Ajuste=20nos=20textos=20do=20diagrama=20e?= =?UTF-8?q?=20do=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pedro Lucas Co-authored-by: Thiago Vivan --- docs/PadroesDeProjeto/Builder.md | 100 ++++++++++++++++++ .../ChainsOfResponsibility.md | 13 ++- 2 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 docs/PadroesDeProjeto/Builder.md diff --git a/docs/PadroesDeProjeto/Builder.md b/docs/PadroesDeProjeto/Builder.md new file mode 100644 index 0000000..9543df8 --- /dev/null +++ b/docs/PadroesDeProjeto/Builder.md @@ -0,0 +1,100 @@ +# Visitor - GoF Comportamental + +## 1. Introdução +..... + +## 2. Objetivo + +... +## 3. Implementação +... +### 3.1. Diagrama UML +Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/). + +![image](https://github.com/user-attachments/assets/831707dd-34a5-410c-9df0-d27fb7a16c89) + +
Figura 1: Desconto. Fonte: Guilherme Nishimura e Pedro Henrique
+ +### 3.2. Código +O código foi desenvolvido em Java , Com a colaboração de [Pedro Henrique ](https://github.com/pehenobra2) e [Guilherme Nishimura](https://github.com/Guilherme-nishi).Para ter o codigo desenvolvido acesse aqui x. + +#### 3.2.1 Interface client +Essa interface Client se encontra no Main.JAVA + +![image](https://github.com/user-attachments/assets/b84f9876-f626-4b38-af1a-17b0fd04fe5e) + +
Figura 2:Client Fonte: Guilherme Nishimura e Pedro Henrique
+ +#### 3.2.1 Interface Product +Essa interface Product se encontra em Product.JAVA + +![image](https://github.com/user-attachments/assets/a897c8b8-8a85-451b-bfa0-eafc033cd769) + + +
Figura 2:Product Fonte: Guilherme Nishimura e Pedro Henrique
+ +#### 3.2.1 Interface visitor +Essa interface visitor se encontra no Visitor.JAVA + + +![image](https://github.com/user-attachments/assets/fd8ab575-3cc5-4acc-adaf-1583bc8e4618) + +
Figura 3:Visitor Fonte: Guilherme Nishimura e Pedro Henrique
+ + +#### 3.2.1 Concret visitor 1 +Concreter visitor Food (comida) que se encontra em Food.java + +![image](https://github.com/user-attachments/assets/22ca9939-2d33-4d8b-93ee-f554db156d95) + + + +
Figura 4:Food Fonte: Guilherme Nishimura e Pedro Henrique
+ +#### 3.2.1 Concret visitor 2 +Concrete visitor Eletronics (Eletronics) que se encontra em Eletronics.java + +![image](https://github.com/user-attachments/assets/d6ea0f82-2bf5-428a-b5f6-815d356d697f) + + + + +
Figura 5:Eletronics Fonte: Guilherme Nishimura e Pedro Henrique
+ +#### 3.2.1 Concret Element 1 +Concrete element Discount A(Desconto a) que se encontra em DiscountA.java + + +![image](https://github.com/user-attachments/assets/45829ee2-15cc-434f-8024-16062ab00dd5) + + + + +
Figura 6:Discount A Fonte: Guilherme Nishimura e Pedro Henrique
+ +#### 3.2.1 Concret Element 2 +Concrete element Discount B(Desconto B) que se encontra em DiscountB.java + + +![image](https://github.com/user-attachments/assets/974ae4de-fbfd-4da3-9e60-fcd93f086656) + + + + +
Figura 7:Discount B Fonte: Guilherme Nishimura e Pedro Henrique
+ + + + + + +## Referências + +> **Arquitetura e Desenho de Software - Aula GoFs Comportamentais**. Material de apoio em slides. Milene Serrano. + +## Versionamento + +| Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | +| :------: | :---: | :-----: | :----: | :----: | :-----: | +| 1.0 | Inicio da estrutura do documento | Guilherme Nishimura |x | 22/07/2023| x| +| 1.1 | Mais alterações | Guilherme Nishimura | Pedro Henrique | 23/07/2023| 23/07/2023| \ No newline at end of file diff --git a/docs/PadroesDeProjeto/ChainsOfResponsibility.md b/docs/PadroesDeProjeto/ChainsOfResponsibility.md index ff34912..4d25653 100644 --- a/docs/PadroesDeProjeto/ChainsOfResponsibility.md +++ b/docs/PadroesDeProjeto/ChainsOfResponsibility.md @@ -16,7 +16,9 @@ Cada uma dessas etapas é responsabilidade de um handler específico. O padrão ## 3. Implementação ... ### 3.1. Diagrama UML -Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/). + + +Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/) pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). ![image](https://github.com/user-attachments/assets/767e17d8-0009-4954-a945-230d875ed61e) @@ -25,6 +27,8 @@ Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com ### 3.2. Código +O código em java a seguir foi desenvolvido, pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). + ```java public interface Handler { Handler setNext(Handler handler); @@ -126,6 +130,7 @@ public class Request { | Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | | :------: | :---: | :-----: | :----: | :----: | :-----: | -| 1.0 | Inicio da estrutura do documento | Mateus Orlando, Pedro Lucas e Thiago Vivan | - | 22/07/2024 | x | -| 2.0 | Adição o código da implementação do GoF | Mateus Orlando, Pedro Lucas e Thiago Vivan | - | 22/07/2024 | x | -| 3.0 | Adição do Diagrama | Mateus Orlando, Pedro Lucas e Thiago Vivan | - | 22/07/2024 | x | +| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 22/07/2024 | x | +| 2.0 | Adição o código da implementação do GoF. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 22/07/2024 | x | +| 3.0 | Adição do Diagrama. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 22/07/2024 | x | +| 3.1 | Pequenos Ajustes nos textos do diagrama e no do código. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 22/07/2024 | x | From 1bca5d0047785fd7b637fcb76db2fdd2c894756a Mon Sep 17 00:00:00 2001 From: MateusPy Date: Tue, 23 Jul 2024 11:41:42 -0300 Subject: [PATCH 06/11] Inicio da Estrutura do Documento Co-authored-by: Pedro Lucas Co-authored-by: Thiago Vivan --- docs/PadroesDeProjeto/Builder.md | 85 +++---------------- .../ChainsOfResponsibility.md | 4 +- 2 files changed, 14 insertions(+), 75 deletions(-) diff --git a/docs/PadroesDeProjeto/Builder.md b/docs/PadroesDeProjeto/Builder.md index 9543df8..2e59160 100644 --- a/docs/PadroesDeProjeto/Builder.md +++ b/docs/PadroesDeProjeto/Builder.md @@ -1,90 +1,30 @@ -# Visitor - GoF Comportamental +# Builder - GoF Criacional ## 1. Introdução -..... + +O Padrão Builder, um elemento essencial dos padrões de projeto criacionais, oferece uma abordagem estruturada para enfrentar o desafio de criar objetos complexos. Ao modularizar o processo de construção e promover a escalabilidade, ele capacita os desenvolvedores a produzir diversas representações de produtos com clareza e precisão. Em um cenário de software em constante evolução, o Padrão Builder destaca-se como um modelo de criação de objetos flexível e claro, facilitando a manutenção e extensão do código. ## 2. Objetivo -... ## 3. Implementação ... ### 3.1. Diagrama UML -Modelagem utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/). - -![image](https://github.com/user-attachments/assets/831707dd-34a5-410c-9df0-d27fb7a16c89) - -
Figura 1: Desconto. Fonte: Guilherme Nishimura e Pedro Henrique
- -### 3.2. Código -O código foi desenvolvido em Java , Com a colaboração de [Pedro Henrique ](https://github.com/pehenobra2) e [Guilherme Nishimura](https://github.com/Guilherme-nishi).Para ter o codigo desenvolvido acesse aqui x. - -#### 3.2.1 Interface client -Essa interface Client se encontra no Main.JAVA - -![image](https://github.com/user-attachments/assets/b84f9876-f626-4b38-af1a-17b0fd04fe5e) - -
Figura 2:Client Fonte: Guilherme Nishimura e Pedro Henrique
- -#### 3.2.1 Interface Product -Essa interface Product se encontra em Product.JAVA - -![image](https://github.com/user-attachments/assets/a897c8b8-8a85-451b-bfa0-eafc033cd769) - - -
Figura 2:Product Fonte: Guilherme Nishimura e Pedro Henrique
- -#### 3.2.1 Interface visitor -Essa interface visitor se encontra no Visitor.JAVA - - -![image](https://github.com/user-attachments/assets/fd8ab575-3cc5-4acc-adaf-1583bc8e4618) - -
Figura 3:Visitor Fonte: Guilherme Nishimura e Pedro Henrique
- - -#### 3.2.1 Concret visitor 1 -Concreter visitor Food (comida) que se encontra em Food.java - -![image](https://github.com/user-attachments/assets/22ca9939-2d33-4d8b-93ee-f554db156d95) +Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/) pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). -
Figura 4:Food Fonte: Guilherme Nishimura e Pedro Henrique
+![image](https://github.com/user-attachments/assets/767e17d8-0009-4954-a945-230d875ed61e) -#### 3.2.1 Concret visitor 2 -Concrete visitor Eletronics (Eletronics) que se encontra em Eletronics.java -![image](https://github.com/user-attachments/assets/d6ea0f82-2bf5-428a-b5f6-815d356d697f) - - - - -
Figura 5:Eletronics Fonte: Guilherme Nishimura e Pedro Henrique
- -#### 3.2.1 Concret Element 1 -Concrete element Discount A(Desconto a) que se encontra em DiscountA.java - - -![image](https://github.com/user-attachments/assets/45829ee2-15cc-434f-8024-16062ab00dd5) - - - - -
Figura 6:Discount A Fonte: Guilherme Nishimura e Pedro Henrique
- -#### 3.2.1 Concret Element 2 -Concrete element Discount B(Desconto B) que se encontra em DiscountB.java - - -![image](https://github.com/user-attachments/assets/974ae4de-fbfd-4da3-9e60-fcd93f086656) - - - - -
Figura 7:Discount B Fonte: Guilherme Nishimura e Pedro Henrique
+
Figura 01: Diagrama de Classes utilizando o padrão criacional Builder. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
+### 3.2. Código +O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). +```java +... +``` @@ -96,5 +36,4 @@ Concrete element Discount B(Desconto B) que se encontra em DiscountB.java | Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | | :------: | :---: | :-----: | :----: | :----: | :-----: | -| 1.0 | Inicio da estrutura do documento | Guilherme Nishimura |x | 22/07/2023| x| -| 1.1 | Mais alterações | Guilherme Nishimura | Pedro Henrique | 23/07/2023| 23/07/2023| \ No newline at end of file +| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x | diff --git a/docs/PadroesDeProjeto/ChainsOfResponsibility.md b/docs/PadroesDeProjeto/ChainsOfResponsibility.md index 4d25653..c295e52 100644 --- a/docs/PadroesDeProjeto/ChainsOfResponsibility.md +++ b/docs/PadroesDeProjeto/ChainsOfResponsibility.md @@ -23,11 +23,11 @@ Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https: ![image](https://github.com/user-attachments/assets/767e17d8-0009-4954-a945-230d875ed61e) -
Figura 01: Desconto. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
+
Figura 01: Diagrama de Classes utilizando o padrão comportamental Chains of Responsibility. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
### 3.2. Código -O código em java a seguir foi desenvolvido, pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). +O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). ```java public interface Handler { From 009713a8d476980d1aa28b98408ab11a92fb55b2 Mon Sep 17 00:00:00 2001 From: MateusPy Date: Tue, 23 Jul 2024 17:46:11 -0300 Subject: [PATCH 07/11] Inicio da Estrutura do Documento Co-authored-by: Pedro Lucas Co-authored-by: Thiago Vivan --- docs/PadroesDeProjeto/Facade.md | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 docs/PadroesDeProjeto/Facade.md diff --git a/docs/PadroesDeProjeto/Facade.md b/docs/PadroesDeProjeto/Facade.md new file mode 100644 index 0000000..d639ee5 --- /dev/null +++ b/docs/PadroesDeProjeto/Facade.md @@ -0,0 +1,39 @@ +# Builder - GoF Criacional + +## 1. Introdução + +O padrão de design Facade oferece uma interface unificada para um conjunto de interfaces em um subsistema. Ele define uma interface de alto nível que simplifica o uso do subsistema, tornando sua interação mais intuitiva e eficiente. + +## 2. Objetivo + +## 3. Implementação +... +### 3.1. Diagrama UML + + +Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/) pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). + +![image](https://github.com/user-attachments/assets/767e17d8-0009-4954-a945-230d875ed61e) + + +
Figura 01: Diagrama de Classes utilizando o padrão Estrutural Facade. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
+ +### 3.2. Código + +O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). + +```java +... +``` + + + +## Referências + +> **Arquitetura e Desenho de Software - Aula GoFs Comportamentais**. Material de apoio em slides. Milene Serrano. + +## Versionamento + +| Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | +| :------: | :---: | :-----: | :----: | :----: | :-----: | +| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x | \ No newline at end of file From 0c2bf26c3bc4be728f84adc1b1ab0ef782b980d7 Mon Sep 17 00:00:00 2001 From: MateusPy Date: Tue, 23 Jul 2024 17:47:25 -0300 Subject: [PATCH 08/11] Ajuste Co-authored-by: Pedro Lucas Co-authored-by: Thiago Vivan --- docs/PadroesDeProjeto/Facade.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/PadroesDeProjeto/Facade.md b/docs/PadroesDeProjeto/Facade.md index d639ee5..8ef96f2 100644 --- a/docs/PadroesDeProjeto/Facade.md +++ b/docs/PadroesDeProjeto/Facade.md @@ -1,4 +1,4 @@ -# Builder - GoF Criacional +# Facade - GoF Estrutural ## 1. Introdução From 05235b0d30c9e1a999c38b032016aebf4d5b8b9d Mon Sep 17 00:00:00 2001 From: thiago vivan <80918128+thiago-vivan@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:54:08 -0300 Subject: [PATCH 09/11] Update Facade.md --- docs/PadroesDeProjeto/Facade.md | 111 ++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 6 deletions(-) diff --git a/docs/PadroesDeProjeto/Facade.md b/docs/PadroesDeProjeto/Facade.md index 8ef96f2..58742b6 100644 --- a/docs/PadroesDeProjeto/Facade.md +++ b/docs/PadroesDeProjeto/Facade.md @@ -2,28 +2,123 @@ ## 1. Introdução -O padrão de design Facade oferece uma interface unificada para um conjunto de interfaces em um subsistema. Ele define uma interface de alto nível que simplifica o uso do subsistema, tornando sua interação mais intuitiva e eficiente. +O Facade(Fachada) é um padrão de projeto estrutural que permite fornecer uma interface unificada para um conjunto de interfaces em um subsistema. O uso do Facade garante uma interface de comunicação entre sistemas de forma clara e segura. ## 2. Objetivo +Considerando o projeto My Market, para realizar uma compra precisamos utilizar vários serviços, conferir o estoque, pagamento, transporte. Dessa forma, podemos utilizar o padrão de Facade para criar uma interface de forma que o cliente só se comunique com a interface e que cada sistema só se comunique com a interface. + + ## 3. Implementação -... + + ### 3.1. Diagrama UML Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/) pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). -![image](https://github.com/user-attachments/assets/767e17d8-0009-4954-a945-230d875ed61e) +![facade](https://github.com/user-attachments/assets/d3f6fe6a-e129-4f3d-9115-08bde8899d37) -
Figura 01: Diagrama de Classes utilizando o padrão Estrutural Facade. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
+
Figura 01: Diagrama de Classes utilizando o padrão estrutural Facade. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
### 3.2. Código O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). ```java -... + +public class MyMarketApp { + + public static void main(String[] args) { + + PedidoFacade facade = new InsFacade(); + CarrinhoController controller = new CarrinhoController(facade); + controller.selecionarProduto(1); + boolean resultado = controller.isPedidoRealizado(); + System.out.println("Pedido concluído? " + resultado); + + } +} + + +public interface PedidoFacade { + + boolean criarPedido(int idProduto); + +} + + +public class InsFacade implements PedidoFacade { + + public boolean criarPedido(int idProduto) { + + boolean pedidoRealizado = false; + + Produto produto = new Produto(); + produto.id = idProduto; + + if (EstoqueService.isDisponivel(produto)) { + System.out.println("Produto com ID " + produto.id + " está disponível!"); + boolean pagtoConfirmado = PagamentoService.realizarPagamento(); + if (pagtoConfirmado) { + System.out.println("Pagamento confirmado..."); + TransportadorService.entregarProduto(produto); + System.out.println("Produto despachado..."); + pedidoRealizado = true; + } + } + return pedidoRealizado; + } +} + + +public class CarrinhoController { + + private PedidoFacade facade; + private boolean pedidoRealizado = false; + + public CarrinhoController(PedidoFacade facade) { + this.facade = facade; + } + + public void selecionarProduto(int idProduto) { + pedidoRealizado = facade.criarPedido(idProduto); + } + + + public boolean isPedidoRealizado() { + return pedidoRealizado; + } +} + + +public class EstoqueService { + + public static boolean isDisponivel(Produto product) { + /* Verifica no banco de dados a disponibilidade do produto */ + return true; + } +} + + +public class PagamentoService { + + public static boolean realizarPagamento() { + /* Conecta com o serviço de pagamento selecionado. */ + return true; + } +} + + +public class TransportadorService { + + public static void entregarProduto(Produto product) { + /* Conecta ao serviço do transportador para entregar o produto */ + } +} + + ``` @@ -32,8 +127,12 @@ O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https: > **Arquitetura e Desenho de Software - Aula GoFs Comportamentais**. Material de apoio em slides. Milene Serrano. +> **Padrão de Projeto Facade em Java**. +[material devMedia](http://www.devmedia.com.br/padrao-de-projeto-facade-em-java/26476) + ## Versionamento | Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | | :------: | :---: | :-----: | :----: | :----: | :-----: | -| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x | \ No newline at end of file +| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x | +| 2.0 | Adição do código e Diagrama | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x | From 0be9386645bd362964c0f8f6419a0e53c7d2876e Mon Sep 17 00:00:00 2001 From: thiago vivan <80918128+thiago-vivan@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:54:08 -0300 Subject: [PATCH 10/11] Update Facade.md Co-authored-by: Mateus Orlando Co-authored-by: Pedro Lucas --- docs/PadroesDeProjeto/Facade.md | 111 ++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 6 deletions(-) diff --git a/docs/PadroesDeProjeto/Facade.md b/docs/PadroesDeProjeto/Facade.md index 8ef96f2..58742b6 100644 --- a/docs/PadroesDeProjeto/Facade.md +++ b/docs/PadroesDeProjeto/Facade.md @@ -2,28 +2,123 @@ ## 1. Introdução -O padrão de design Facade oferece uma interface unificada para um conjunto de interfaces em um subsistema. Ele define uma interface de alto nível que simplifica o uso do subsistema, tornando sua interação mais intuitiva e eficiente. +O Facade(Fachada) é um padrão de projeto estrutural que permite fornecer uma interface unificada para um conjunto de interfaces em um subsistema. O uso do Facade garante uma interface de comunicação entre sistemas de forma clara e segura. ## 2. Objetivo +Considerando o projeto My Market, para realizar uma compra precisamos utilizar vários serviços, conferir o estoque, pagamento, transporte. Dessa forma, podemos utilizar o padrão de Facade para criar uma interface de forma que o cliente só se comunique com a interface e que cada sistema só se comunique com a interface. + + ## 3. Implementação -... + + ### 3.1. Diagrama UML Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/) pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). -![image](https://github.com/user-attachments/assets/767e17d8-0009-4954-a945-230d875ed61e) +![facade](https://github.com/user-attachments/assets/d3f6fe6a-e129-4f3d-9115-08bde8899d37) -
Figura 01: Diagrama de Classes utilizando o padrão Estrutural Facade. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
+
Figura 01: Diagrama de Classes utilizando o padrão estrutural Facade. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
### 3.2. Código O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). ```java -... + +public class MyMarketApp { + + public static void main(String[] args) { + + PedidoFacade facade = new InsFacade(); + CarrinhoController controller = new CarrinhoController(facade); + controller.selecionarProduto(1); + boolean resultado = controller.isPedidoRealizado(); + System.out.println("Pedido concluído? " + resultado); + + } +} + + +public interface PedidoFacade { + + boolean criarPedido(int idProduto); + +} + + +public class InsFacade implements PedidoFacade { + + public boolean criarPedido(int idProduto) { + + boolean pedidoRealizado = false; + + Produto produto = new Produto(); + produto.id = idProduto; + + if (EstoqueService.isDisponivel(produto)) { + System.out.println("Produto com ID " + produto.id + " está disponível!"); + boolean pagtoConfirmado = PagamentoService.realizarPagamento(); + if (pagtoConfirmado) { + System.out.println("Pagamento confirmado..."); + TransportadorService.entregarProduto(produto); + System.out.println("Produto despachado..."); + pedidoRealizado = true; + } + } + return pedidoRealizado; + } +} + + +public class CarrinhoController { + + private PedidoFacade facade; + private boolean pedidoRealizado = false; + + public CarrinhoController(PedidoFacade facade) { + this.facade = facade; + } + + public void selecionarProduto(int idProduto) { + pedidoRealizado = facade.criarPedido(idProduto); + } + + + public boolean isPedidoRealizado() { + return pedidoRealizado; + } +} + + +public class EstoqueService { + + public static boolean isDisponivel(Produto product) { + /* Verifica no banco de dados a disponibilidade do produto */ + return true; + } +} + + +public class PagamentoService { + + public static boolean realizarPagamento() { + /* Conecta com o serviço de pagamento selecionado. */ + return true; + } +} + + +public class TransportadorService { + + public static void entregarProduto(Produto product) { + /* Conecta ao serviço do transportador para entregar o produto */ + } +} + + ``` @@ -32,8 +127,12 @@ O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https: > **Arquitetura e Desenho de Software - Aula GoFs Comportamentais**. Material de apoio em slides. Milene Serrano. +> **Padrão de Projeto Facade em Java**. +[material devMedia](http://www.devmedia.com.br/padrao-de-projeto-facade-em-java/26476) + ## Versionamento | Versão | Alteração | Responsável | Revisor | Data de realização | Data de revisão | | :------: | :---: | :-----: | :----: | :----: | :-----: | -| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x | \ No newline at end of file +| 1.0 | Inicio da estrutura do documento. | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x | +| 2.0 | Adição do código e Diagrama | [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan) | - | 23/07/2024 | x | From e12c75ddfe9b1fcd0c00041386386f97f2bb0b82 Mon Sep 17 00:00:00 2001 From: Pedro Lucas Garcia <190115548@aluno.unb.br> Date: Wed, 24 Jul 2024 20:07:42 -0300 Subject: [PATCH 11/11] =?UTF-8?q?Padr=C3=A3o=20criacional=20Builder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Mateus Orlando Co-authored-by: Thiago Vivan --- docs/PadroesDeProjeto/Builder.md | 223 ++++++++++++++++++++++++++++++- 1 file changed, 220 insertions(+), 3 deletions(-) diff --git a/docs/PadroesDeProjeto/Builder.md b/docs/PadroesDeProjeto/Builder.md index 2e59160..add8c3f 100644 --- a/docs/PadroesDeProjeto/Builder.md +++ b/docs/PadroesDeProjeto/Builder.md @@ -5,6 +5,35 @@ O Padrão Builder, um elemento essencial dos padrões de projeto criacionais, oferece uma abordagem estruturada para enfrentar o desafio de criar objetos complexos. Ao modularizar o processo de construção e promover a escalabilidade, ele capacita os desenvolvedores a produzir diversas representações de produtos com clareza e precisão. Em um cenário de software em constante evolução, o Padrão Builder destaca-se como um modelo de criação de objetos flexível e claro, facilitando a manutenção e extensão do código. ## 2. Objetivo +No MyMarket um produto pode ter vários atributos obrigatórios e opcionais que precisam ser preenchidos para um objeto ser construído. Pensando nisto, uma forma de evitar um construtor enorme com muitos campos nulos preenchidos seria criar um Builder para fornecer uma implementação mais limpa do objeto Produto. + +Como exemplo, considere os seguintes atributos: + +### Atributos Obrigatórios: + +- id (int): Identificador único do produto. +- name (String): Nome do produto. +- price (double): Preço do produto. +- quantity (int): Quantidade em estoque. +- category (String): Categoria do produto. + +### Atributos Opcionais: + +- description (String): Descrição do produto. +- brand (String): Marca do produto. +- size (String): Tamanho do produto (ex: P, M, G, GG ou especificações como 15cm x 10cm). +- color (String): Cor do produto. +- weight (double): Peso do produto. +- dimensions (String): Dimensões do produto (ex: 30cm x 20cm x 10cm). +- material (String): Material do produto. +- manufacturer (String): Fabricante do produto. +- warranty (String): Garantia do produto. +- sku (String): Stock Keeping Unit, código de rastreamento do produto. +- releaseDate (LocalDate): Data de lançamento do produto. +- ratings (double): Classificação média do produto. +- numReviews (int): Número de avaliações do produto. +- imageURL (String): URL da imagem do produto. +- tags (List): Lista de tags associadas ao produto. ## 3. Implementação ... @@ -13,7 +42,7 @@ O Padrão Builder, um elemento essencial dos padrões de projeto criacionais, of Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https://www.lucidchart.com/pages/) pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). -![image](https://github.com/user-attachments/assets/767e17d8-0009-4954-a945-230d875ed61e) +![Builder](https://github.com/user-attachments/assets/5274db2c-c138-437b-af9d-d99f9d52741d)
Figura 01: Diagrama de Classes utilizando o padrão criacional Builder. Fonte: Mateus Orlando, Pedro Lucas e Thiago Vivan.
@@ -23,10 +52,198 @@ Modelagem a seguir foi criada utilizando a ferramenta online [Lucidchart](https: O código em java a seguir foi desenvolvido pelos alunos [Mateus Orlando](https://github.com/MateusPy), [Pedro Lucas](https://github.com/AlefMemTav) e [Thiago Vivan](https://github.com/thiago-vivan). ```java -... -``` +import java.time.LocalDate; +import java.util.List; + +public class Product { + private final int id; + private final String name; + private final double price; + private final int quantity; + private final String category; + private final String description; + private final String brand; + private final String size; + private final String color; + private final double weight; + private final String dimensions; + private final String material; + private final String manufacturer; + private final String warranty; + private final String sku; + private final LocalDate releaseDate; + private final double ratings; + private final int numReviews; + private final String imageURL; + private final List tags; + + private Product(ProductBuilder builder) { + this.id = builder.id; + this.name = builder.name; + this.price = builder.price; + this.quantity = builder.quantity; + this.category = builder.category; + this.description = builder.description; + this.brand = builder.brand; + this.size = builder.size; + this.color = builder.color; + this.weight = builder.weight; + this.dimensions = builder.dimensions; + this.material = builder.material; + this.manufacturer = builder.manufacturer; + this.warranty = builder.warranty; + this.sku = builder.sku; + this.releaseDate = builder.releaseDate; + this.ratings = builder.ratings; + this.numReviews = builder.numReviews; + this.imageURL = builder.imageURL; + this.tags = builder.tags; + } + + public static class ProductBuilder { + private final int id; + private final String name; + private final double price; + private final int quantity; + private final String category; + private String description; + private String brand; + private String size; + private String color; + private double weight; + private String dimensions; + private String material; + private String manufacturer; + private String warranty; + private String sku; + private LocalDate releaseDate; + private double ratings; + private int numReviews; + private String imageURL; + private List tags; + + public ProductBuilder(int id, String name, double price, int quantity, String category) { + this.id = id; + this.name = name; + this.price = price; + this.quantity = quantity; + this.category = category; + } + + public ProductBuilder setDescription(String description) { + this.description = description; + return this; + } + + public ProductBuilder setBrand(String brand) { + this.brand = brand; + return this; + } + + public ProductBuilder setSize(String size) { + this.size = size; + return this; + } + + public ProductBuilder setColor(String color) { + this.color = color; + return this; + } + + public ProductBuilder setWeight(double weight) { + this.weight = weight; + return this; + } + + public ProductBuilder setDimensions(String dimensions) { + this.dimensions = dimensions; + return this; + } + public ProductBuilder setMaterial(String material) { + this.material = material; + return this; + } + + public ProductBuilder setManufacturer(String manufacturer) { + this.manufacturer = manufacturer; + return this; + } + + public ProductBuilder setWarranty(String warranty) { + this.warranty = warranty; + return this; + } + + public ProductBuilder setSku(String sku) { + this.sku = sku; + return this; + } + + public ProductBuilder setReleaseDate(LocalDate releaseDate) { + this.releaseDate = releaseDate; + return this; + } + + public ProductBuilder setRatings(double ratings) { + this.ratings = ratings; + return this; + } + + public ProductBuilder setNumReviews(int numReviews) { + this.numReviews = numReviews; + return this; + } + + public ProductBuilder setImageURL(String imageURL) { + this.imageURL = imageURL; + return this; + } + + public ProductBuilder setTags(List tags) { + this.tags = tags; + return this; + } + + public Product build() { + return new Product(this); + } + } + +} + +// Exemplo de uso +import java.time.LocalDate; +import java.util.Arrays; + +public class Main { + public static void main(String[] args) { + Product product = new Product.ProductBuilder(1, "T-Shirt", 29.99, 50, "Clothing") + .setDescription("Comfortable cotton t-shirt") + .setBrand("FashionBrand") + .setSize("M") + .setColor("Blue") + .setWeight(0.2) + .setDimensions("40cm x 30cm x 1cm") + .setMaterial("Cotton") + .setManufacturer("FashionBrand Inc.") + .setWarranty("6 months") + .setSku("TSHIRT12345") + .setReleaseDate(LocalDate.of(2024, 4, 1)) + .setRatings(4.7) + .setNumReviews(200) + .setImageURL("http://example.com/tshirt.jpg") + .setTags(Arrays.asList("clothing", "t-shirt", "fashion")) + .build(); + + System.out.println(product); + } +} + + +``` +Observe: Atualmente há algumas ferramentas, por exemplo, o Lombok para a linguagem Java, que permitem criar um Builder. No caso do Lombok basta usar a anotação @Builder na classe Product. ## Referências