quarta-feira, fevereiro 18

Entender design patterns para iniciantes como Singleton e Factory pode parecer um bicho de sete cabeças, né? Eu também achava! Mas, se seu código está virando uma bagunça difícil de gerenciar, a gente vai desmistificar isso juntos. Este post vai te mostrar como esses padrões resolvem problemas reais de organização.

Desvendando os Segredos da Organização do Código: Design Patterns Para Facilitar Sua Vida!

Já se pegou pensando em como deixar seu código mais organizado e fácil de manter? Pois é, os design patterns são como receitas testadas e aprovadas por programadores experientes. Eles resolvem problemas comuns de arquitetura de software, garantindo que suas soluções sejam robustas e escaláveis.

Vamos falar de dois clássicos para quem tá começando: Singleton e Factory. O Singleton garante que uma classe tenha apenas uma instância, útil para gerenciar recursos únicos. Já o Factory foca em delegar a criação de objetos, te livrando de código repetitivo e complexo.

Confira este vídeo relacionado para mais detalhes:

Os Padrões Essenciais: Singleton e Factory Para Começar a Desenvolver Com Confiança

Entendendo o Padrão Singleton: Uma Única Instância Para Controle Total - inspiração 1
Imagem/Fonte: www.geeksforgeeks.org

Entendendo o Padrão Singleton: Uma Única Instância Para Controle Total

Sabe quando você precisa garantir que uma parte do seu programa só exista uma única vez? Tipo um controle central que gerencia todas as conexões com um banco de dados, ou um logger que grava todas as mensagens do sistema. É aí que entra o padrão Singleton. A ideia é simples: criar uma classe que permite ter apenas uma única instância dela em todo o seu sistema. Isso evita que você acabe criando várias cópias desnecessárias, o que pode dar uma dor de cabeça danada para gerenciar depois.

Entendendo o Padrão Singleton: Uma Única Instância Para Controle Total - inspiração 2
Imagem/Fonte: www.geeksforgeeks.org

Pense nisso como um documento muito importante que só existe uma versão original. Se você precisa ler ou modificar algo desse documento, você sempre vai atrás daquela única cópia. No código, o Singleton garante isso controlando a criação da sua própria instância e fornecendo um ponto de acesso global para ela. Para nós que estamos aprendendo design patterns, como um iniciante, entender o Singleton é um passo chave para organizar melhor nossas aplicações e garantir que certos elementos sejam únicos e bem controlados.

Quando você implementa um Singleton, você está, na prática, garantindo um ponto de acesso único para um objeto. Isso é especialmente útil para gerenciamento de configuração ou para recursos que não podem ser duplicados. Evita conflitos e simplifica a lógica de acesso a esses recursos centralizados.

Dica Prática: Use o padrão Singleton para gerenciar um objeto de configuração global da sua aplicação, garantindo que todas as partes do código acessem as mesmas configurações.

Quando Usar o Singleton: Cenários Práticos e Exemplos Simples - inspiração 1
Imagem/Fonte: www.ionos.com

Quando Usar o Singleton: Cenários Práticos e Exemplos Simples

Quando Usar o Singleton: Cenários Práticos e Exemplos Simples - inspiração 2
Imagem/Fonte: www.startertutorials.com

Pra que serve isso na prática? Imagina que você tem um arquivo de configuração que precisa ser lido apenas uma vez e acessado de vários pontos do seu código. Se você criar várias cópias desse arquivo, pode dar problema. Com o Singleton, você carrega ele uma vez e todos os outros pedaços do seu programa usam a mesma cópia. Outro exemplo comum é um logger, para registrar eventos do sistema. Você quer que todas as mensagens de log vão para o mesmo arquivo, certo? O Singleton garante que só exista um logger funcionando.

Onde você vê isso em ação? Em sistemas onde você precisa de um ponto de controle único, como um gerenciador de conexões com banco de dados ou um cache. Pense em um jogo: o jogador tem um único perfil, certo? Não faz sentido ter vários perfis de jogador ativos ao mesmo tempo para a mesma partida. O Singleton pode ser usado para gerenciar esse perfil. É uma forma elegante de evitar duplicidade e garantir que tudo funcione de maneira consistente.

Dica Prática: Ao implementar um Singleton, pense bem se realmente é necessário ter apenas uma instância. Às vezes, a simplicidade de criar objetos normais pode ser mais vantajosa e menos propensa a erros inesperados em projetos maiores.

Implementando o Singleton: Variações e Cuidados Importantes - inspiração 1
Imagem/Fonte: ujjwalbhardwaj.me

Implementando o Singleton: Variações e Cuidados Importantes

O Singleton é um daqueles padrões de design que parecem assustadores no começo. A ideia central é simples: garantir que uma classe tenha apenas uma única instância e fornecer um ponto de acesso global a ela. Pense em algo como o “gerente geral” do seu software. Você não quer ter vários gerentes fazendo a mesma coisa, certo? Com o Singleton, você controla isso, garantindo que só exista um objeto daquele tipo rodando no seu programa. É muito útil quando você precisa de um recurso centralizado, como um log de eventos ou uma configuração global.

Implementando o Singleton: Variações e Cuidados Importantes - inspiração 2
Imagem/Fonte: medium.com

Agora, como a gente faz isso na prática? Existem algumas variações para implementar o Singleton. Uma forma comum é usar um construtor privado e um método estático que verifica se a instância já existe. Se existir, ele a retorna; se não, ele cria uma nova e a retorna. Essa abordagem garante que, não importa quantas vezes você chame esse método, a mesma instância será usada. É fundamental para controlar o uso de recursos que não devem ser duplicados, evitando conflitos e garantindo a consistência.

Um ponto de atenção: em ambientes com múltiplas threads (onde várias coisas acontecem ao mesmo tempo), você precisa ter cuidado para que a criação da instância seja segura. Se duas threads tentarem criar a instância simultaneamente, pode dar problema. Felizmente, existem técnicas para lidar com isso, como o uso de locks. Mas para quem está começando, focar na lógica básica já é um grande passo. Vamos combinar, o Singleton pode ser um aliado poderoso para organizar seu código.

Dica Prática: Ao usar o Singleton, sempre pense se realmente é necessário ter apenas uma instância. Evite o uso excessivo, pois pode dificultar testes e aumentar o acoplamento entre as partes do seu código.

Apresentando o Padrão Factory: Criando Objetos de Forma Flexível - inspiração 1
Imagem/Fonte: www.tutorialspoint.com

Apresentando o Padrão Factory: Criando Objetos de Forma Flexível

Você já se pegou tendo que criar vários objetos do mesmo tipo, mas com pequenas diferenças? Pois é, o Padrão Factory entra em cena para resolver isso. Ele funciona como uma “fábrica” mesmo, que sabe como montar esses objetos para você. Em vez de você se preocupar com os detalhes de como cada objeto é criado, você simplesmente pede à fábrica o que precisa. Isso deixa seu código mais limpo e fácil de gerenciar.

Apresentando o Padrão Factory: Criando Objetos de Forma Flexível - inspiração 2
Imagem/Fonte: levelup.gitconnected.com

Pensa comigo: imagine que você tem um sistema que precisa criar diferentes tipos de mensagens, como mensagens de erro, de sucesso ou de alerta. Sem o Factory, você teria um monte de código para decidir qual tipo de mensagem criar. Com o Factory, você tem uma única interface para pedir “crie uma mensagem de erro”, e ele cuida do resto. Essa abstração é o que torna tudo mais flexível. É um ótimo exemplo de design patterns para iniciantes entenderem como organizar a criação de objetos.

Vamos combinar, a grande sacada é que você não precisa mexer na lógica de criação de cada tipo de objeto sempre que precisar de um novo. O Factory centraliza essa responsabilidade. Se você precisar adicionar um novo tipo de mensagem no futuro, é só dizer para a fábrica como criá-lo, sem bagunçar o resto do seu sistema. Isso é muito útil.

Dica Prática: Ao usar o Padrão Factory, pense em como ele pode te ajudar a adicionar novos tipos de objetos sem ter que alterar o código que já está funcionando. Isso poupa um tempão!

O Poder da Factory Method: Centralizando a Criação de Instâncias - inspiração 1
Imagem/Fonte: medium.com

O Poder da Factory Method: Centralizando a Criação de Instâncias

Muita gente acha que criar objetos em programação é simples, mas quando o projeto cresce, a bagunça começa a aparecer. É aí que entra o Factory Method. Pense nele como um “fábrica” especializada em criar outros objetos. Em vez de você sair criando um monte de coisas espalhadas pelo código, você centraliza essa responsabilidade em um único lugar. Isso facilita muito a manutenção e a adição de novos tipos de objetos no futuro.

O Poder da Factory Method: Centralizando a Criação de Instâncias - inspiração 2
Imagem/Fonte: softwareparticles.com

E para que o Factory Method fique ainda mais interessante, podemos combiná-lo com o padrão Singleton. O Singleton garante que uma classe tenha apenas uma única instância e fornece um ponto de acesso global para ela. Quando você usa um Singleton com um Factory Method, por exemplo, você pode ter uma fábrica que é garantidamente única em todo o seu sistema. Isso é ótimo para gerenciar recursos compartilhados, como conexões com bancos de dados ou configurações globais. A ideia é ter um controle rígido sobre como e quando esses objetos são criados e acessados.

Ao dominar o uso do Factory Method, você ganha um controle muito maior sobre a criação de objetos. Isso se reflete diretamente na organização e na robustez do seu software. Com o Singleton, você garante que certos objetos cruciais sejam gerenciados de forma eficiente, evitando duplicações desnecessárias.

Dica Prática: Ao implementar um Factory Method, comece com um exemplo simples. Crie uma fábrica para criar diferentes tipos de conexões de rede (HTTP, FTP). Isso ajuda a visualizar o fluxo e a entender os benefícios antes de aplicar em cenários mais complexos.

Factory Abstract: Produzindo Famílias de Objetos Relacionados - inspiração 1
Imagem/Fonte: www.softwaretestinghelp.com

Factory Abstract: Produzindo Famílias de Objetos Relacionados

Você já se deparou com situações onde precisa criar vários objetos que são meio parecidos, mas com algumas diferenças? O Factory Abstract é um padrão de design que ajuda justamente nisso. Ele cria uma “fábrica” para essas famílias de objetos relacionados. Pensa comigo: em vez de chamar a criação de cada objeto específico toda hora, você chama a fábrica, e ela te entrega o que você precisa, tudo organizado. É como ter uma linha de produção que sabe exatamente qual peça montar dependendo do que você pede.

Factory Abstract: Produzindo Famílias de Objetos Relacionados - inspiração 2
Imagem/Fonte: refactoring.guru

Vamos usar o Singleton como um exemplo simples de “fábrica” para um único objeto. Imagina que você precisa acessar uma configuração do seu sistema, e essa configuração só pode existir uma vez. Com o Singleton, você garante que apenas uma instância desse objeto de configuração seja criada. Toda vez que você pedir essa configuração, a mesma instância será retornada. Isso evita problemas e garante que todos usem os mesmos dados, sem confusão.

A beleza do Factory Abstract é que ele desacopla o código que usa os objetos do código que os cria. Ou seja, você não precisa saber os detalhes exatos de como cada objeto é feito. A fábrica cuida disso. Se um dia precisar mudar como um objeto é criado, você só mexe na fábrica, e o resto do seu programa continua funcionando sem saber das mudanças. É uma forma inteligente de manter seu código mais limpo e fácil de manter.

Dica Prática: Ao implementar um Singleton, sempre pense se realmente é necessário que existam apenas uma instância do objeto. Use-o para recursos compartilhados e únicos, como conexões com banco de dados ou configurações globais.

Exemplos Visuais da Factory em Ação: De Jogos a Aplicativos - inspiração 1
Imagem/Fonte: www.geeksforgeeks.org

Exemplos Visuais da Factory em Ação: De Jogos a Aplicativos

Quando falamos de “design patterns para iniciantes”, o Singleton Factory surge como um ótimo exemplo. Pense nele como um mestre de cerimônias que garante que apenas uma instância de um objeto seja criada e utilizada em todo o seu programa. Isso é super útil para gerenciar recursos, como um arquivo de configuração ou uma conexão com banco de dados, por exemplo. Assim, você evita ter várias cópias desnecessárias rodando e consumindo memória à toa.

Exemplos Visuais da Factory em Ação: De Jogos a Aplicativos - inspiração 2
Imagem/Fonte: medium.com

No mundo dos games, o Singleton Factory pode ser usado para gerenciar um objeto único que controla o estado do jogo inteiro, como pontuações, fases atuais ou configurações de áudio. Da mesma forma, em aplicativos, ele pode ser a chave para ter um único ponto de acesso a informações importantes ou a serviços que não devem ser duplicados, garantindo a integridade dos dados. É a ideia de ter um “gerente” central para certas tarefas.

Essa abordagem simplifica o código e previne problemas. Se você tem um objeto que precisa ser acessado de várias partes do seu aplicativo, garantir que todos usem a mesma instância é fundamental. Sem isso, você pode acabar com dados inconsistentes ou comportamentos inesperados. Para quem está começando com “design patterns”, entender o Singleton Factory é um passo importante.

Dica Prática: Ao trabalhar em um projeto, se perceber que precisa de um objeto que não deve ter mais de uma cópia, pense no Singleton Factory. Ele pode ser a solução elegante para o seu problema.

Comparando Singleton e Factory: Qual Usar em Cada Situação? - inspiração 1
Imagem/Fonte: www.geeksforgeeks.org

Comparando Singleton e Factory: Qual Usar em Cada Situação?

Pois é, quando a gente começa a fuçar em código, logo esbarra em termos como Singleton e Factory. Muita gente se confunde, mas a ideia é bem direta. O Singleton é como aquele seu amigo que é o único que tem a chave da casa da praia. Ele garante que só existe uma instância desse “objeto” em todo o sistema. Pensa num gerenciador de configurações, ou num objeto que guarda dados importantes e não pode se repetir. Ele controla o acesso, garantindo que todos usem a mesma cópia. É útil quando você precisa de um ponto centralizado e único.

Comparando Singleton e Factory: Qual Usar em Cada Situação? - inspiração 2
Imagem/Fonte: www.softwaretestinghelp.com

Já o Factory, o conceito é um pouco diferente. Imagina uma linha de montagem de carros. Você não precisa saber exatamente qual parafuso vai onde, você só pede um “carro” e a fábrica te entrega. O Factory é exatamente isso: uma fábrica de objetos. Ele esconde a complexidade de como os objetos são criados. Você diz qual tipo de objeto quer, e o Factory se vira para te entregar. É ótimo para quando você tem várias opções de criação e quer manter o código limpo, sem precisar ficar decidindo qual “carro” montar na hora.

Então, resumindo a ópera: Singleton é para garantir que algo seja único, como um único ponto de acesso a um banco de dados. Factory é para criar vários objetos de forma controlada, como criar diferentes tipos de usuários em um sistema. Cada um tem seu papel e usar o certo evita dor de cabeça lá na frente. São dois pilares para escrever código mais organizado e eficiente.

Dica Prática: Se você precisa de uma única instância para gerenciar algo global no seu sistema, vá de Singleton. Se sua necessidade é criar objetos diferentes com base em alguma condição, mas sem expor a lógica de criação, o Factory é seu melhor amigo.

Evitando Armadilhas Comuns: Erros Clássicos com Padrões de Projeto - inspiração 1
Imagem/Fonte: medium.com

Evitando Armadilhas Comuns: Erros Clássicos com Padrões de Projeto

Quando a gente pensa em design patterns para iniciantes, o Singleton e a Factory surgem logo de cara. O Singleton parece simples: garantir que uma classe tenha apenas uma instância. A Factory parece útil: criar objetos sem expor a lógica de instanciação. Mas é aqui que muita gente cai na armadilha de achar que são soluções mágicas, sem entender direito o contexto. Usar Singleton onde não precisa, por exemplo, pode complicar testes futuros. A gente acha que tá facilitando, mas cria uma dependência forte que depois dá dor de cabeça.

Evitando Armadilhas Comuns: Erros Clássicos com Padrões de Projeto - inspiração 2
Imagem/Fonte: refactoring.guru

Pois é, o erro mais comum com o Singleton é forçar o uso dele em todo lugar. Às vezes, você precisa de uma instância única mesmo, para gerenciar uma conexão de banco de dados ou um logger. Mas se você transforma tudo em Singleton, seu código fica difícil de testar e de dar manutenção. Na Factory, o problema é parecido: usar ela para instanciar objetos que são super simples, só para seguir o “padrão”. A gente precisa lembrar que padrões são guias, não regras engessadas. Eles resolvem problemas comuns, mas a aplicação errada é pior do que não usar nada.

Vamos combinar: o segredo é entender o *porquê* de cada padrão. O Singleton serve pra controlar a instanciação e garantir um ponto de acesso global. A Factory serve pra desacoplar a criação de objetos da sua lógica principal. Se você sentir que está aplicando um padrão só porque leu sobre ele, pare e pense. Será que esse problema *realmente* se encaixa na solução que esse padrão oferece? Às vezes, uma classe normal e um construtor bem feito resolvem o problema de forma muito mais limpa.

Dica Prática: Antes de implementar um Singleton ou uma Factory, escreva no papel qual problema específico você quer resolver. Se a resposta não for clara ou se parecer que você está forçando a barra, investigue outras abordagens mais simples primeiro.

Próximos Passos: Explorando Outros Design Patterns Fundamentais - inspiração 1
Imagem/Fonte: rajneekanth.wordpress.com

Próximos Passos: Explorando Outros Design Patterns Fundamentais

Você já ouviu falar do padrão Singleton? A ideia aqui é simples e muito útil: garantir que uma classe tenha apenas uma única instância, e que haja um ponto global de acesso a ela. Pense em algo como um arquivo de configuração do seu programa. Não faz sentido ter vários arquivos de configuração diferentes rodando ao mesmo tempo, certo? O Singleton resolve isso. Ele garante que, não importa quantas vezes você tente criar um objeto dessa classe, você sempre vai receber a mesma instância.

Próximos Passos: Explorando Outros Design Patterns Fundamentais - inspiração 2
Imagem/Fonte: levelup.gitconnected.com

Já o padrão Factory, ou Fábrica, é um pouco diferente. Em vez de criar objetos diretamente, você usa uma fábrica para criá-los. Imagina que você tem diferentes tipos de veículos (carro, moto, caminhão) e precisa criar um deles com base em alguma condição. Em vez de escrever um monte de “if/else” para decidir qual criar, você chama um método da sua fábrica. Ela se encarrega de instanciar o objeto correto para você. Isso deixa seu código mais limpo e flexível, porque se você adicionar um novo tipo de veículo, é só mudar a fábrica, e não todo o código que usa os veículos.

Esses dois padrões, Singleton e Factory, são blocos de construção para escrever código mais organizado e sustentável. Saber quando usar cada um vai te poupar muita dor de cabeça no futuro. Eles são ótimos exemplos de como pensar na criação de objetos de forma estratégica, algo fundamental para qualquer desenvolvedor.

Dica Prática: Ao usar Singleton, lembre-se que ele pode dificultar os testes se não for bem implementado. Pense em como você vai poder “enganar” o Singleton durante os testes para poder isolar outras partes do seu código.

Como os Design Patterns Mudam o Jogo no Desenvolvimento Web

ItemConceito PrincipalOnde se AplicaDicas Práticas do Autor
Entendendo o Padrão Singleton: Uma Única Instância Para Controle TotalGarante que uma classe tenha apenas uma instância e fornece um ponto de acesso global a ela.Gerenciamento de configurações, pools de conexão, logs.Pense em coisas que você só precisa de uma vez no seu sistema, tipo um “administrador geral”. Controle quem acessa para não criar confusão.
Quando Usar o Singleton: Cenários Práticos e Exemplos SimplesAjuda a centralizar recursos e a evitar a criação de múltiplos objetos idênticos desnecessariamente.Quando a exclusividade é crucial e a duplicação seria um problema.Se o seu app precisa de uma única configuração global ou um registro central, o Singleton é seu parceiro. Mas use com moderação, viu?
Implementando o Singleton: Variações e Cuidados ImportantesExistem várias formas de implementar, cada uma com seus prós e contras em termos de performance e segurança em ambientes concorrentes.Controle de acesso, inicialização lazy.Fique atento a threads! Se muitos acessos chegam ao mesmo tempo, pode dar ruim. Pesquise sobre implementação thread-safe.
Apresentando o Padrão Factory: Criando Objetos de Forma FlexívelDefine uma interface para criar objetos, mas deixa as subclasses decidirem qual classe instanciar.Quando você precisa criar diferentes tipos de objetos de forma padronizada.É como ter uma linha de montagem. Você diz o que quer, e a fábrica te entrega. Simples assim.
O Poder da Factory Method: Centralizando a Criação de InstânciasO Factory Method permite que uma classe delegue a instanciação para subclasses.Sistemas de plugins, frameworks de UI.Ajuda a desacoplar seu código. Sua aplicação não precisa saber qual “tipo” de objeto está sendo criado, só que ele faz o trabalho.
Factory Abstract: Produzindo Famílias de Objetos RelacionadosCria famílias de objetos relacionados sem especificar suas classes concretas.Aplicações que precisam se adaptar a diferentes temas ou famílias de produtos.Sabe quando você tem um conjunto de coisas que combinam, tipo um tema “claro” e um tema “escuro” com botões e textos que combinam? Isso é Abstract Factory.
Exemplos Visuais da Factory em Ação: De Jogos a AplicativosDemonstrações práticas ajudam a entender como esses padrões são usados para criar sistemas mais robustos e flexíveis.Criação de personagens em jogos, diferentes tipos de janelas em GUIs.Olha um jogo: vários inimigos diferentes? A fábrica cuida disso. Um app com modos escuro/claro? A fábrica de temas.
Comparando Singleton e Factory: Qual Usar em Cada Situação?Entender as diferenças

Confira este vídeo relacionado para mais detalhes:

Dicas de Ouro Para Aplicar Padrões no Seu Próximo Projeto

Pois é, aplicar padrões de projeto como Singleton e Factory pode parecer intimidante no começo, mas acredite, faz toda a diferença na organização e manutenibilidade do seu código. Eu já passei por isso e quero te dar umas dicas práticas para descomplicar.

  • Comece Pequeno: Não tente aplicar tudo de uma vez. Escolha um ou dois padrões para o seu projeto atual. Começar com o Singleton para gerenciar uma configuração global ou uma conexão com banco de dados é um ótimo pontapé inicial.
  • Entenda o Problema que o Padrão Resolve: Antes de sair codando, pense: qual problema específico esse padrão vai resolver no meu código? O Singleton evita múltiplas instâncias onde só uma faz sentido. A Factory cria objetos sem expor a lógica de instanciação.
  • Factory para Variações: Se você percebe que precisa criar diferentes tipos de um mesmo objeto e essa lógica está ficando repetitiva ou complexa, a Factory é sua aliada. Crie uma classe Factory que saiba como produzir cada variação.
  • Cuidado com o Singleton: Embora útil, o uso excessivo de Singleton pode criar dependências fortes e dificultar testes. Use com parcimônia, apenas onde realmente for necessário garantir uma única instância.

Dúvidas das Leitoras

O que são design patterns e por que são importantes?

Design patterns são soluções testadas para problemas comuns no desenvolvimento de software. Eles ajudam a criar código mais organizado, fácil de entender e de dar manutenção.

O padrão Singleton é realmente necessário?

O Singleton garante que uma classe tenha apenas uma instância e fornece um ponto de acesso global a ela. Use-o com cuidado, pois pode dificultar os testes se mal aplicado.

Qual a diferença entre Factory Method e Abstract Factory?

Factory Method foca em criar um objeto de uma classe. Abstract Factory cria famílias de objetos relacionados, sem especificar suas classes concretas.

Posso misturar Singleton e Factory em um mesmo projeto?

Sim, você pode. Um Singleton pode ser usado para gerenciar instâncias de Factories, por exemplo, para garantir que haja apenas um ponto de acesso para a criação de objetos complexos.

Como começar a praticar design patterns no dia a dia?

Comece identificando problemas recorrentes em seus projetos. Escolha um pattern que resolva esse problema e tente implementá-lo. Leia código de projetos open-source para ver patterns em ação.

É isso aí! Vimos como os design patterns Singleton e Factory podem simplificar seu código, mesmo quando você tá começando. São ferramentas que realmente fazem a diferença na organização e manutenção dos seus projetos. Continue praticando e explorando. Se curtiu esses exemplos, quem sabe você não se interessa por outros conceitos como Strategy também? Deixe seu comentário com o que achou!

Curtiu? Salve ou Compartilhe

Nelson Reis é um profissional experiente e líder no setor de tecnologia, reconhecido por sua capacidade de traduzir conceitos complexos de TI em soluções práticas e eficientes para empresas. Com uma forte veia empreendedora, ele se destaca por sua habilidade em gestão de equipes e por atuar como um conselheiro de confiança (trusted advisor) para seus clientes.

Comments are closed.