DEV Community

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

Posted on

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! 😊

Top comments (1)

Collapse
 
carlosdiasdasi8 profile image
Carlos Dias Da Silva

Magnifico