Como funcionam os objetos criados seguindo singleton? – javascript design-pattern singleton

Pergunta:


Gostaria de entender como funcionam os objetos criados seguindo o design pattern singleton em javascript.

Minhas principais duvidas são referentes aos métodos e atributos desse objeto, onde e como cria-los e onde e como acessa-los.

Li alguns artigos até em inglês mas não compreendi muito bem a forma de usar corretamente o singleton.

Como exemplo tenho esse código:

Fonte: Dofactory – Singleton

var Singleton = (function () {
    var instance;

    function createInstance() {
        var object = new Object("I am the instance");
        return object;
    }

    return {
        getInstance: function () {
            if (!instance) {
                instance = createInstance();
            }
            return instance;
        }
    };
})();

function run() {

    var instance1 = Singleton.getInstance();
    var instance2 = Singleton.getInstance();

    alert("Same instance? " + (instance1 === instance2)); //retorna true 
}

Os objetos estão sendo instanciados na function run, minha duvida nisso seria, se quero adicionar um método stop e um atributo status para saber se esse objeto está em run ou stop, como devo fazer isso seguindo o design pattern singleton?

Referencia:

A Beginner’s Guide to Design Patterns

JavaScript Design Patterns: Singleton

Autor da pergunta RodrigoBorth

Talvez começar olhando para ponteiros de memória dê uma esclarecida.

Veja essa situação utilizando o NEW

var a = new Object('Some Object A');
var b = new Object('Some Object B');

Nesse código temos dois objetos criados em duas variáveis diferentes. Na memória de sua máquina, fica mais ou menos assim:

Código                   Memória
var a ---------------->  Posição 0000
var b ---------------->  Posição 0001

Ouse seja, duas cópias são criadas.

Se eu fizer o seguinte:

var c = b;

Nesse caso, c === b, porque:

Código                   Memória
var a ---------------->  Posição 0000
var b ---------------->  Posição 0001
var c ---------------->  Posição 0001

Note que tanto b e c apontam para a mesma área de memória, ou seja, o mesmo objeto.

Isso é um básico de como funciona, resumido.
Agora olhe no seu exemplo:

getInstance: function () {
  if (!instance) {
    instance = createInstance();
  }
  return instance;
}

Aqui você tá fazendo que se instance não existe, então cria uma instância. Logo, cada vez que você chamar getInstance, na primeira vez ele cria com NEW e nas outras apenas retorna o que já foi criado da primeira vez.

Colocando isso nos exemplos que citei:

var a = Singleton.getInstance();
var b = Singleton.getInstance();
var c = Singleton.getInstance();


Código                   Memória
var a ---------------->  Posição 0000
var b ---------------->  Posição 0000
var c ---------------->  Posição 0000

Em resumo, isso acontece porque só uma vez é criado e na outra, apenas uma referência para a instancia Singleton é retornada.

Espero que o textão tenha ajudado!!!

No seu exemplo, Object seria o objeto que você quer tornar um singleton.
Basta substituir (dado que você definiu seu objeto) e, se usar apenas o Singleton, você sempre terá apenas um exemplar do objeto.

Você deve criar os seus métodos run e stop dentro da definição desse objeto seu.

Para uma revisão de como isso é feito, dê uma olhada aqui: Como funcionam protótipos em JavaScript?

Uma forma de visualizar é a seguinte.

Imagine que você tem uma classe de conexão com o banco de dados, e não quer criar um objeto novo na memória toda vez que você precisar acessar o banco de dados, então você usa o Singleton.

Isso vai garantir que se crie vários objetos para fazer uma coisa comum em várias partes do projeto.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *