Design patterns javascript: O Padrão de modelo Revelador e o Padrão Singleton

26/06/2021

Padrões de design são padrões que podem ser comumente aplicados no desenvolvimento de softwares. Para algo ser considerado um padrão ele deve obedecer a três critérios básicos: serem uma solução provada, serem facilmente reutilizáveis e podem ser usados em diversos sistemas distintos. O padrão de modelo revelador e o Padrão Singleton que falaremos hoje não foge a essa regra.

O Padrão modelo revelador

Introdução

No último post falamos sobre o padrão de modelos . Esse padrão está ligado ao padrão de modelos revelador, uma vez que Christian Heilmann's (criador do padrão de modelos revelador), cria esse padrão para resolver problemas do padrão de modelos. De acordo com ele, sua frustração nasce da necessidade de ter que repetir o nome do objeto quando ele queria chamar um método público. Além disso, ter que mudar a notação literal de seu objeto para mudar algo entre público e privado o incomodava.

A solução que ele encontrou para solucionar o problema foi transformar todas as funções e variáveis em privadas, e retornar um objeto anônimo com um ponteiro para as funções que ele gostaria que fossem públicas.

  • Exemplo:

var myRevealingModule = (function () {

    var privateVar = "Ben Cherry",

    publicVar = "Hey there!";

    function privateFunction() {

        console.log( "Name:" + privateVar );

    }

    function publicSetName( strName ) {

         privateVar = strName;

    }

    function publicGetName() {

        privateFunction();

    }

// Reveal public pointers to // private functions and properties

    return {

        setName: publicSetName,

        greeting: publicVar,

        getName: publicGetName

    };

})();

myRevealingModule.setName( "Paul Kinlan" ); - Código encontrado no livro "

Learning JavaScript Design Patterns

A book by Addy Osmani

"


No exemplo acima, você consegue ver com mais clareza como o padrão pode ser usado na prática.


Vantagens

  • Esse padrão permite que seus scripts sejam mais consistentes;

  • Permite a visualização mais facilitada daquilo que pode ser acessado de forma pública e aquilo que não pode, mudando pequenos detalhes do padrão de modelos convencionais.

Desvantagens

  • Se uma função privada se refere a uma função pública, essa função pública não pode ser substituída se uma atualização for necessária. O padrão não se aplica a membros públicos, somente a funções
  • Objetos públicos que se referem a variáveis privadas, também estão sujeitos ao último problema, ou seja, objetos públicos podem não ser substituídos caso uma atualização seja necessária.
  • Esse módulo pode ser mais frágil do que o padrão de modelos original graças aos dois últimos tópicos.

Padrão Singleton

Introdução

Esse padrão é bastante conhecido, no javascript sua função é restringir a instanciação de uma classe a um único objeto.

Classicamente, o padrão Singleton pode ser implementado criando uma classe com um método que cria uma nova instância da classe, se não existir. No caso de uma instância já existente, ele simplesmente retorna uma referência a esse objeto.

No javascript, ele fornece um único ponto de acesso para funções.

  • Exemplo:

var mySingleton = (function () {

    // Instance stores a reference to the Singleton

    var instance;

    function init() {

        // Singleton // Private methods and variables

        function privateMethod(){

             console.log( "I am private" );

        }

        var privateVariable = "Im also private";

        var privateRandomNumber = Math.random();

        return {

            // Public methods and variables

           publicMethod: function () {

               console.log( "The public can see me!" );

           },

           publicProperty: "I am also public",

           getRandomNumber: function() {

                  return privateRandomNumber;

           }

       };

};

return {

// Get the Singleton instance if one exists // or create one if it doesn't getInstance: function () {

    if ( !instance ) {

        instance = init();

    }

    return instance;

}

};

})();


var singleA = mySingleton.getInstance();

console.log(singleA.getRandomNumber());

Código encontrado no livro "

Learning JavaScript Design Patterns

A book by Addy Osmani

"


Singletons diferem de classes (ou objetos) estáticos, pois podemos atrasar sua inicialização, geralmente porque eles requerem algumas informações que podem não estar disponíveis durante o tempo de inicialização. Eles não fornecem uma maneira para o código que não está ciente de uma referência anterior a eles recuperá-los facilmente. Isso ocorre porque não é o objeto ou "classe" que é retornado por um Singleton, é uma estrutura.

Vantagem

  • Esse padrão é útil quando um único objeto precisa ter suas ações coordenadas por todo o sistema.

  • Ele garante que uma classe (no caso do javascript representada por uma função), tenha apenas uma instância

Desvantagem

  • Singletons podem ser mais difíceis de testar devido a problemas que vão desde dependências ocultas, dificuldade em criar várias instâncias e assim por diante.

Se esse artigo foi útil para você, considere se inscrever na nossa newslleter. Demora menos de um minuto e você vai ficar informado de artigos como esse e muito mais. Só precisamos do seu email: