DEV Community

Cover image for Padrões de Projeto em PHP: Singleton
Rubens dos Santos
Rubens dos Santos

Posted on

5 2

Padrões de Projeto em PHP: Singleton

Design Patterns, os padrões de projetos, são extremamente úteis e eficazes na escalabilidade, robustez e compreensão do código. Embora seja um nome que nos leve a pensar em complexidade, o principal intuito de um padrão de projeto é resolver um problema. Foram formulados pela tão estimada Gang of Four e são utilizados em larga escala. Pense neles como uma solução para situações onde você provavelmente reinventaria a roda se não os conhecesse.

O padrão de projeto que vou apresentar hoje é um padrão criacional (uma das três categoria de padrões de projeto): o Singleton

Tanto o conceito como a aplicabilidade do Singleton são simples. O Singleton preza que apenas uma instância seja retornada. Isso possui diversa aplicabilidades. Pense numa classe com funcionalidades genéricas que é utilizada em vários pontos de sua aplicação, mas que não possui um estado. Seria uma boa ideia utilizar um Singleton para essa classe, certo?

Vou explicar por etapas a construção dessa classe para objetos solitários.

Vamos voltar ao anime Naruto e fingir que o único Uchiha existente realmente é o Sasuke (embora saibamos que tenha mais Uchihas no mundo do que Almeidas). Logo só existe um Uchiha na face da terra.

final class Uchiha {
}
Enter fullscreen mode Exit fullscreen mode

Ao declarar a palavra-chave final no inicio da classe estamos dizendo que essa classe não pode ser herdada, isto é: não pode gerar classes filhas. É isso mesmo, vamos fingir que o Sasuke é estéril também (pobre Sasuke).

Um dos modos efetivos de bloquear a instanciação de uma classe é impedir sua proliferação é não deixando que o metodo construtor seja invocado... e não, não adianta deixar de definir um construtor, a classe faz isso automaticamente. Uma técnica que podemos aplicar é utilizando o modificador de acesso private em oposição ao public, em nosso construtor:

final class Uchiha {

    private function __construct()
    {
    }

}
Enter fullscreen mode Exit fullscreen mode

Outra situação que precisamos impedir é a clonagem do nosso Uchiha (afinal só se clona Senjus no anime). A técnica é a mesma: impedir acesso externo ao método especial.

final class Uchiha {

    private function __construct()
    {
    }

    private function __clone()
    {
    }

}
Enter fullscreen mode Exit fullscreen mode

Um cenário mais atípico: existe um método especial no PHP chamado o __wakeup, ele permite a completa construção de objetos desserializados (o Google é seu amigo). Vamos prevenir essa arte de Orochimaru tornando também o método __wakeup privado

final class Uchiha {

    private function __construct()
    {
    }

    private function __clone()
    {
    }

    private function __wakeup()
    {
    }

}
Enter fullscreen mode Exit fullscreen mode

Por fim, vamos criar um método que permite retornar o nosso Uchiha.

final class Uchiha {

    // Declaramos o atributo a ser retornado
    private static ?Uchiha $instance

    private function __construct()
    {
    }

    private function __clone()
    {
    }

    private function __wakeup()
    {
    }

    // Método para obter a instância
    public function getInstance()
    {
       // Garantimos que somente uma instância seja criada
       if (!isset(self::$instance)) {
           self::$instance = new static();
       }

       // Por fim retornamos a instância
       return self::$instance;
    }
}

// criamos nosso objeto Singleton
$sasuke = Uchiha::getInstance();
Enter fullscreen mode Exit fullscreen mode

Por hoje é só pessoal.
Até a próxima! 😊

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (1)

Collapse
 
carlosdiasdasi8 profile image
Carlos Dias Da Silva

Magnifico

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs