Design patterns javascript: O Padrão de modelo Revelador e o Padrão Singleton
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
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.