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 {
}
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()
{
}
}
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()
{
}
}
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()
{
}
}
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();
Por hoje é só pessoal.
Até a próxima! 😊
Top comments (1)
Magnifico