디자인 패턴: 싱글톤

Permite que você garanta que uma classe tenha apenas uma instância, enquanto provê acesso global para ela.



O padrão Singleton resolve esses dois problemas de uma vez, mas por outro lado viola o princípio de responsabilidade única.

문제에 대한 설명



  • Permite que você garanta que uma classe tenha apenas uma instância.

    Você deve estar se perguntando o motivo de alguém querer isso, mas um bom exemplo é quando precisamos usar em vários pontos da aplicação um recurso compartilhado, como por exemplo a conexão. Quando criado um objeto, ao precisar usar ele novamente aaplicação irá te devolver o mesmo objeto criado anteriormente ao invés de criá-lo novamente.

  • Provê acesso global para uma instância.

    Quem nunca criou aquela variável global no index para ser usado ao longo do projeto? Nunca fez? É, eu já fiz hehe



    São bem úteis, não irei mentir pra você, mas são bem inseguras, pois o seu conteúdo pode ser alterado por qualquer codigo e criar um efeito colateral na sua aplicação.

    Na mesma ideia de uma variável global, o Singleton permite que você acesse uma instância de uma classe globalmente em qualquer lugar da aplicação, mas previne que o seu do seja sobrescrito por outro codigo.

  • 코모 구현체


  • Crie um campo privado estático na classe para o guardar a instância.

  • <?php
    class Database 
    {
        private static $instance;
    // Continuação da classe...
    


  • Declare um método de criação público e estático para obter a instância singleton Ex: getInstance .

  • // Inicio da classe...
    
    public static function getInstance() 
    {
        // Implementação da função 
    }
    
    // Continuação da classe...
    


  • 초기 계획을 실행하십시오. Ela deve criar um novo objeto na sua Primeira chamada e colocá-lo no campo estático. O metodo deve semper retornar aquela instância em todas as chamadas posteriores.

  • // Inicio da classe...
    
    public static function getInstance() 
    {
        if (is_null(self::$instance)) {
            echo 'Passou aqui uma só vez' . PHP_EOL;
            self::$instance = new self();
        }
    
        return self::$instance;
    }
    
    // Continuação da classe...
    


    OBS: Se tiver trabalhando com multi thread, dever colocar um thread lock antes do operadornew no métodogetInstance .
  • Pode parecer estranho, mas faça o construtor da classe ser privado. O método estático da classe vai conseguir chamar o construtor, mas irá previnir a criação através de outros objetos.

  • // Inicio da classe...
    
    private function __construct() 
    {
        $this->connection = 'conectado';
    }
    
    // Continuação da classe...
    


  • Vá para o código cliente e faça a chamada para o método estático do singleton.

  • $database = Database::getInstance();
    


    아고라 바모스 ver todo o código daimplementação.




    <?php
    class Database 
    {
        private static $instance;
        private $connection;
    
        private function __construct() 
        {
            $this->connection = 'conectado';
        }
    
        public function query($sql) 
        {
            return 'Resultado da query: ' . $sql . PHP_EOL;
        }
    
        public static function getInstance() 
        {
            if (is_null(self::$instance)) {
                echo 'Passou aqui uma só vez' . PHP_EOL;
                self::$instance = new self();
            }
            return self::$instance;
        }
    }
    
    class User 
    {
        public function getUser()
        {
            $database = Database::getInstance();
            return $database->query('SELECT * FROM Users;');
        }
    }
    
    class Transactions 
    {
        public function getTransaction()
        {
            $database = Database::getInstance();
            return $database->query('SELECT * FROM Transactions;');
        }
    }
    
    // Case 1
    $user = new User;
    echo $user->getUser();
    
    // Case 1
    $transaction = new Transactions;
    echo $transaction->getTransaction();
    
    $database = new Database; //fatal error
    


    Nas classes que Representativeam as models User e Transactions a instância está dentro da função, mas numa implementationação

    결론



    단일 톤 quando você ver a necessidade de uma classe possuir apenas uma instância disponível e global em sua aplicação e tbm caso precision de um controle mais estrito sobre as variáveis ​​globais를 사용하십시오.

    É isso galera, chegamos no fim de mais um artigo inté o próximo!

    좋은 웹페이지 즐겨찾기