SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Padrão de Projeto
Singleton
Adriano Reine
Brian Mazini
Rafael Barros
Wendel Moreira
Sumário
 Introdução
 Padrões de Projeto
 Padrão Singleton
 Exemplo
 Considerações Finais
 Referências Bibliográficas
Introdução
O que é um padrão de projeto?
 Um padrão de projeto é uma estrutura recorrente
no projeto de software orientado a objetos. Pelo
fato de ser recorrente, vale a pena que seja
documentado e estudado.
O que faz um padrão de projeto?
 Um padrão de projeto nomeia, abstrai e identifica
os aspetos chave de uma estrutura de projeto
comum para torná-la útil para a criação de um
projeto orientado a objetos reutilizável.
Padrões de Projeto
 Os padrões de projeto são observados através da
experiência de um desenvolvedor com projetos
de software, o que significa que os padrões são
descobertos, e não inventados.
 Como eles fornecem soluções prontas para a
solução de problemas, existem diversas
vantagens no seu uso como:
 a reutilização de códigos, modelos e arquiteturas,
 a padronização de designs e boas práticas,
 a criação de uma linguagem comum entre
desenvolvedores.
Padrões de Projeto
 Podemos classificar os padrões de projeto de
várias maneiras, porém o mais comum é
classificá-los de acordo com os tipos de
problemas que eles resolvem.
 De acordo com esse critério, os padrões podem
ser:
 Padrões de Criação: que lidam com o problema da
criação de objetos;
 Padrões Estruturais: que lidam com os
relacionamentos entre objetos;
 Padrões Comportamentais: que lidam com os
algoritmos e a atribuição de responsabilidades aos
objetos.
Padrão Singleton
 O Padrão Singleton é um padrão criacional
 É garantido que apenas uma única instância do
objeto seja instanciada em todo o projeto.
 Qual a funcionalidade disso?
 Objetos que tratam de pools de conexão, saídas
gráficas, impressão, objetos que cuidam de registros
não devem ser instanciados mais de uma vez
 Um outro uso do padrão SINGLETON é quando
queremos uma classe de Log para todo o sistema, sem
precisarmos utilizar recursos do sistema para instanciar
uma classe sempre que precisarmos gravar dados no
servidor.
Padrão Singleton
 Alguns programadores devem estar pensando agora: Mas
isso é fácil! Basta eu ter uma variável global com a
instância do objeto e sempre acessar ela! O problema é que
essa variável sendo inicializada no começo da execução do
projeto, essa classe estará consumindo recursos mesmo
sem ser utilizada! Com o Singleton, a classe só é
instanciada quando você realmente precisa dela!
 Como previnir que um objeto não seja instanciado mais de
uma vez?
 Criar um construtor privado. Com isso, a classe só pode ser
instanciada dentro de algum dos seus próprios métodos!
public class Singleton {
private Singleton () { }
}
Padrão Singleton
Agora que só podemos instanciar a classe dentro de um método,
vamos fazer com que esse método nos garanta que apenas uma
classe seja inicializada. Para isso vamos ter uma variável estática
que guardará a instância do único objeto instanciado. Caso ela
esteja nula, a função irá instanciar o objeto e então retorná-lo
para o usuário. Caso ela já contenha uma instância, o método
apenas retorna o objeto. Em código, temos:
public class Singleton {
private static Singleton instancia = null;
private Singleton () { }
public static Singleton getInstance() {
if(instancia==null) instancia = new Singleton ();
return instancia;
}
}
Padrão Singleton
Pronto! Nossa classe agora é um Singleton! Não é
possível ter mais de uma instância desse objeto!
Como se faz para instanciar um objeto já que não
posso simplesmente dar um “new” nele?
Singleton c1 = Singleton.getInstance();
Singleton c2 = Singleton.getInstance();
Em nosso exemplo, c1 e c2 representam o
mesmo objeto!
Exemplo
Problema: Como garantir que UMA e SOMENTE
UMA instância de uma certa classe exista durante
toda a execução do sistema?
Na figura abaixo podemos ver a solução Singleton com UML.
Exemplo
Imagine a seguinte situação:
"Gostaria de criar uma classe que gerasse uma
conexão com meu banco de dados. Quando eu
acessar a primeira vez essa classe, será
construída uma conexão, mas no decorrer da
execução, caso exista mais acessos ao banco,
gostaria de utilizar a MESMA classe com a MESMA
conexão."
Exemplo
Exemplo
Para instanciar uma classe, ou seja, para criar um
objeto de uma classe, precisamos utilizar o
operador new.
Exemplo: conexao = new Conexao();
Quando instanciamos uma classe, ao utilizar new, o
PHP automaticamente faz a chamada ao método
__construct() definido na classe;
Um atributo estático (static) é instanciado somente
uma vez e é compartilhado por TODOS os
objetos da mesma classe; mesmo que você
possua vários objetos de uma mesma classe,
esse atributo será o mesmo para todos.
Exemplo
Sabendo desses conceitos, vamos ao nosso código:
Na linha 1 do código definimos a classe Conexao;
Na linha 3 definimos uma atributo de instância estática da
classe;
Na linha 5 criamos o método construtor - __construct() - da
classe; perceba que o método está marcado como
PRIVATE, isso indica que se tentarmos utilizar o operador
new com essa classe teremos um erro de execução,
EXCETO se utilizarmos internamente à classe;
Na linha 6 colocamos nosso código para executar a conexão
com o banco de dados. Esse código ficará dentro do
método construtor;
Na linha 11 definimos o método publico getInstancia(). Esse
será o único método visível da classe e será responsável
por recuperar o objeto instancia;
Exemplo
Na linha 12 executamos o teste condicional, se o atributo
instancia for false, ou seja, no primeiro acesso à classe,
ele entrará no bloco;
Na linha 13 criamos uma instância da classe Conexao.
Perceba que utilizamos o operador new, portanto o método
__construct() será chamado, criando uma conexão com o
banco de dados.
Mas o método __construct() é private!!
Claro, mas isso não proíbe que a PROPRIA classe acesse
esse método. Somente proíbe o acesso do "lado de fora" da
classe Conexao;
Na linha 16 retornamos o atributo instancia.
Note pelo código que o objeto instancia será criado apenas
UMA vez, note também que, independentemente de onde
estamos chamando a classe Conexao, o método
getInstancia() retornará SEMPRE o mesmo objeto.
Considerações Finais
 Singleton:
 um dos padrões mais simples,
 um dos mais criticados e mal usados.
 Os singletons são difíceis de escalar, pois é difícil garantir
uma única instância de um singleton em um cluster, onde
existem várias JVMs.
 Um outro problema é que os singletons dificultam o hot
redeploy por permanecerem em cache, bloqueando
mudanças de configuração.
 Por esses e outros problemas, deve-se ter cuidado com o
uso abusivo de singletons.
 CUIDADO! A utilização dos Padrões de Projetos é uma
"faca de dois gumes". O abuso de Padrões pode "engessar"
o projeto, dificultando sua manuntenção.
Referências Bibliográficas
 FREEMAN E.; FREEMAN. E; SIERRA, K.; BATES B. Head
First: Design Patterns. Sebastopol: O’Reilly, 2001.
 Padrões de Projeto: Soluções Reutilizáveis de Software
Orientado a Objetos – “The Gang of Four”
 http://www.elton.utfpr.net/Escola/Padrão%20Singleton.pdf
 http://www.plugmasters.com.br/sys/materias/893/1/Padr
%F5es-de-Projeto%3A-Singleton
Perguntas ?

Weitere ähnliche Inhalte

Was ist angesagt?

Padrões de Projeto: Adapter
Padrões de Projeto: AdapterPadrões de Projeto: Adapter
Padrões de Projeto: AdapterMessias Batista
 
Spring Framework
Spring FrameworkSpring Framework
Spring Frameworknomykk
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Ryan Padilha
 
Fundamentos e princípios do projeto orientado a objetos
Fundamentos e princípios do projeto orientado a objetosFundamentos e princípios do projeto orientado a objetos
Fundamentos e princípios do projeto orientado a objetosEvandro Agnes
 
Open Closed Principle kata
Open Closed Principle kataOpen Closed Principle kata
Open Closed Principle kataPaul Blundell
 
Scala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentationScala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentationMartin Odersky
 
Programação Orientada a Objetos de Arduino com Eclipse
Programação Orientada a Objetos de Arduino com EclipseProgramação Orientada a Objetos de Arduino com Eclipse
Programação Orientada a Objetos de Arduino com EclipseTchelinux
 
Polimorfismo em java
Polimorfismo em javaPolimorfismo em java
Polimorfismo em javaManoel Afonso
 
Java - Aula 4 - Sobrecarga de construtores, UML e Herança
Java - Aula 4 - Sobrecarga de construtores, UML e HerançaJava - Aula 4 - Sobrecarga de construtores, UML e Herança
Java - Aula 4 - Sobrecarga de construtores, UML e HerançaMoises Omena
 
데브루키 IK 1편
데브루키 IK 1편데브루키 IK 1편
데브루키 IK 1편Soochan Park
 
S.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software ArchitectsS.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software ArchitectsRicardo Wilkins
 
Java: Composicao e Array List
Java: Composicao e Array ListJava: Composicao e Array List
Java: Composicao e Array ListArthur Emanuel
 
Programação orientada a objetos em delphi
Programação orientada a objetos em delphiProgramação orientada a objetos em delphi
Programação orientada a objetos em delphiHelder Lopes
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDPavel Tsukanov
 
SOLID Design Principles
SOLID Design PrinciplesSOLID Design Principles
SOLID Design PrinciplesAndreas Enbohm
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback흥배 최
 

Was ist angesagt? (20)

SOLID Principles
SOLID PrinciplesSOLID Principles
SOLID Principles
 
Padrões de Projeto: Adapter
Padrões de Projeto: AdapterPadrões de Projeto: Adapter
Padrões de Projeto: Adapter
 
Spring Framework
Spring FrameworkSpring Framework
Spring Framework
 
Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)Orientação a Objetos no Delphi - Controle de Estoque (II)
Orientação a Objetos no Delphi - Controle de Estoque (II)
 
Fundamentos e princípios do projeto orientado a objetos
Fundamentos e princípios do projeto orientado a objetosFundamentos e princípios do projeto orientado a objetos
Fundamentos e princípios do projeto orientado a objetos
 
Open Closed Principle kata
Open Closed Principle kataOpen Closed Principle kata
Open Closed Principle kata
 
Solid principles
Solid principlesSolid principles
Solid principles
 
Scala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentationScala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentation
 
Programação Orientada a Objetos de Arduino com Eclipse
Programação Orientada a Objetos de Arduino com EclipseProgramação Orientada a Objetos de Arduino com Eclipse
Programação Orientada a Objetos de Arduino com Eclipse
 
Polimorfismo em java
Polimorfismo em javaPolimorfismo em java
Polimorfismo em java
 
Java - Aula 4 - Sobrecarga de construtores, UML e Herança
Java - Aula 4 - Sobrecarga de construtores, UML e HerançaJava - Aula 4 - Sobrecarga de construtores, UML e Herança
Java - Aula 4 - Sobrecarga de construtores, UML e Herança
 
Encapsulamento em oo
Encapsulamento em ooEncapsulamento em oo
Encapsulamento em oo
 
Python SOLID
Python SOLIDPython SOLID
Python SOLID
 
데브루키 IK 1편
데브루키 IK 1편데브루키 IK 1편
데브루키 IK 1편
 
S.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software ArchitectsS.O.L.I.D. Principles for Software Architects
S.O.L.I.D. Principles for Software Architects
 
Java: Composicao e Array List
Java: Composicao e Array ListJava: Composicao e Array List
Java: Composicao e Array List
 
Programação orientada a objetos em delphi
Programação orientada a objetos em delphiProgramação orientada a objetos em delphi
Programação orientada a objetos em delphi
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
 
SOLID Design Principles
SOLID Design PrinciplesSOLID Design Principles
SOLID Design Principles
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 

Andere mochten auch

Padrões de projeto - Adapter, Proxy, Composite e Bridge
Padrões de projeto - Adapter, Proxy, Composite e BridgePadrões de projeto - Adapter, Proxy, Composite e Bridge
Padrões de projeto - Adapter, Proxy, Composite e BridgeLorran Pegoretti
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projetoejdn1
 
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010Flávio Lisboa
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareCarlos Santana
 
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebProposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebEr Galvão Abbott
 
Boas práticas de django
Boas práticas de djangoBoas práticas de django
Boas práticas de djangoFilipe Ximenes
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de ProjetoEduardo Mendes
 
Introdução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de SoftwareIntrodução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de SoftwareWillian Carminato
 
Gerenciamento de-projetos-exercicios-resolvidos-estudo-de-casos-e-simulacoes
Gerenciamento de-projetos-exercicios-resolvidos-estudo-de-casos-e-simulacoesGerenciamento de-projetos-exercicios-resolvidos-estudo-de-casos-e-simulacoes
Gerenciamento de-projetos-exercicios-resolvidos-estudo-de-casos-e-simulacoesJucioliver
 

Andere mochten auch (10)

Padrões de projeto - Adapter, Proxy, Composite e Bridge
Padrões de projeto - Adapter, Proxy, Composite e BridgePadrões de projeto - Adapter, Proxy, Composite e Bridge
Padrões de projeto - Adapter, Proxy, Composite e Bridge
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projeto
 
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebProposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
 
Boas práticas de django
Boas práticas de djangoBoas práticas de django
Boas práticas de django
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de Projeto
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
 
Introdução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de SoftwareIntrodução a Padrões de Projeto - Engenharia de Software
Introdução a Padrões de Projeto - Engenharia de Software
 
Gerenciamento de-projetos-exercicios-resolvidos-estudo-de-casos-e-simulacoes
Gerenciamento de-projetos-exercicios-resolvidos-estudo-de-casos-e-simulacoesGerenciamento de-projetos-exercicios-resolvidos-estudo-de-casos-e-simulacoes
Gerenciamento de-projetos-exercicios-resolvidos-estudo-de-casos-e-simulacoes
 

Ähnlich wie Padrão de Projetos singleton

Ähnlich wie Padrão de Projetos singleton (20)

Java7
Java7Java7
Java7
 
Patterns
PatternsPatterns
Patterns
 
Prototype1 - thiago
Prototype1 - thiagoPrototype1 - thiago
Prototype1 - thiago
 
Conhecendo o Spring
Conhecendo o SpringConhecendo o Spring
Conhecendo o Spring
 
Orientação a Objetos no Delphi - Por onde começar (I)
Orientação a Objetos no Delphi - Por onde começar (I)Orientação a Objetos no Delphi - Por onde começar (I)
Orientação a Objetos no Delphi - Por onde começar (I)
 
Apresentação Introdução Design Patterns
Apresentação Introdução Design PatternsApresentação Introdução Design Patterns
Apresentação Introdução Design Patterns
 
Padroes de Projeto
Padroes de ProjetoPadroes de Projeto
Padroes de Projeto
 
Singleton varianca
Singleton variancaSingleton varianca
Singleton varianca
 
Padrões de design orientado a objetos
Padrões de design orientado a objetosPadrões de design orientado a objetos
Padrões de design orientado a objetos
 
pec-12-patterns-intro.ppt
pec-12-patterns-intro.pptpec-12-patterns-intro.ppt
pec-12-patterns-intro.ppt
 
Aula1
Aula1Aula1
Aula1
 
Curso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosCurso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetos
 
Arquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhrArquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhr
 
Java11
Java11Java11
Java11
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Quick reference
Quick referenceQuick reference
Quick reference
 
Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em Java
 
Construtores em Java
Construtores em JavaConstrutores em Java
Construtores em Java
 
Construtor em Java
Construtor em JavaConstrutor em Java
Construtor em Java
 
Classes e Objectos JAVA
Classes e Objectos JAVAClasses e Objectos JAVA
Classes e Objectos JAVA
 

Padrão de Projetos singleton

  • 1. Padrão de Projeto Singleton Adriano Reine Brian Mazini Rafael Barros Wendel Moreira
  • 2. Sumário  Introdução  Padrões de Projeto  Padrão Singleton  Exemplo  Considerações Finais  Referências Bibliográficas
  • 3. Introdução O que é um padrão de projeto?  Um padrão de projeto é uma estrutura recorrente no projeto de software orientado a objetos. Pelo fato de ser recorrente, vale a pena que seja documentado e estudado. O que faz um padrão de projeto?  Um padrão de projeto nomeia, abstrai e identifica os aspetos chave de uma estrutura de projeto comum para torná-la útil para a criação de um projeto orientado a objetos reutilizável.
  • 4. Padrões de Projeto  Os padrões de projeto são observados através da experiência de um desenvolvedor com projetos de software, o que significa que os padrões são descobertos, e não inventados.  Como eles fornecem soluções prontas para a solução de problemas, existem diversas vantagens no seu uso como:  a reutilização de códigos, modelos e arquiteturas,  a padronização de designs e boas práticas,  a criação de uma linguagem comum entre desenvolvedores.
  • 5. Padrões de Projeto  Podemos classificar os padrões de projeto de várias maneiras, porém o mais comum é classificá-los de acordo com os tipos de problemas que eles resolvem.  De acordo com esse critério, os padrões podem ser:  Padrões de Criação: que lidam com o problema da criação de objetos;  Padrões Estruturais: que lidam com os relacionamentos entre objetos;  Padrões Comportamentais: que lidam com os algoritmos e a atribuição de responsabilidades aos objetos.
  • 6. Padrão Singleton  O Padrão Singleton é um padrão criacional  É garantido que apenas uma única instância do objeto seja instanciada em todo o projeto.  Qual a funcionalidade disso?  Objetos que tratam de pools de conexão, saídas gráficas, impressão, objetos que cuidam de registros não devem ser instanciados mais de uma vez  Um outro uso do padrão SINGLETON é quando queremos uma classe de Log para todo o sistema, sem precisarmos utilizar recursos do sistema para instanciar uma classe sempre que precisarmos gravar dados no servidor.
  • 7. Padrão Singleton  Alguns programadores devem estar pensando agora: Mas isso é fácil! Basta eu ter uma variável global com a instância do objeto e sempre acessar ela! O problema é que essa variável sendo inicializada no começo da execução do projeto, essa classe estará consumindo recursos mesmo sem ser utilizada! Com o Singleton, a classe só é instanciada quando você realmente precisa dela!  Como previnir que um objeto não seja instanciado mais de uma vez?  Criar um construtor privado. Com isso, a classe só pode ser instanciada dentro de algum dos seus próprios métodos! public class Singleton { private Singleton () { } }
  • 8. Padrão Singleton Agora que só podemos instanciar a classe dentro de um método, vamos fazer com que esse método nos garanta que apenas uma classe seja inicializada. Para isso vamos ter uma variável estática que guardará a instância do único objeto instanciado. Caso ela esteja nula, a função irá instanciar o objeto e então retorná-lo para o usuário. Caso ela já contenha uma instância, o método apenas retorna o objeto. Em código, temos: public class Singleton { private static Singleton instancia = null; private Singleton () { } public static Singleton getInstance() { if(instancia==null) instancia = new Singleton (); return instancia; } }
  • 9. Padrão Singleton Pronto! Nossa classe agora é um Singleton! Não é possível ter mais de uma instância desse objeto! Como se faz para instanciar um objeto já que não posso simplesmente dar um “new” nele? Singleton c1 = Singleton.getInstance(); Singleton c2 = Singleton.getInstance(); Em nosso exemplo, c1 e c2 representam o mesmo objeto!
  • 10. Exemplo Problema: Como garantir que UMA e SOMENTE UMA instância de uma certa classe exista durante toda a execução do sistema? Na figura abaixo podemos ver a solução Singleton com UML.
  • 11. Exemplo Imagine a seguinte situação: "Gostaria de criar uma classe que gerasse uma conexão com meu banco de dados. Quando eu acessar a primeira vez essa classe, será construída uma conexão, mas no decorrer da execução, caso exista mais acessos ao banco, gostaria de utilizar a MESMA classe com a MESMA conexão."
  • 13. Exemplo Para instanciar uma classe, ou seja, para criar um objeto de uma classe, precisamos utilizar o operador new. Exemplo: conexao = new Conexao(); Quando instanciamos uma classe, ao utilizar new, o PHP automaticamente faz a chamada ao método __construct() definido na classe; Um atributo estático (static) é instanciado somente uma vez e é compartilhado por TODOS os objetos da mesma classe; mesmo que você possua vários objetos de uma mesma classe, esse atributo será o mesmo para todos.
  • 14. Exemplo Sabendo desses conceitos, vamos ao nosso código: Na linha 1 do código definimos a classe Conexao; Na linha 3 definimos uma atributo de instância estática da classe; Na linha 5 criamos o método construtor - __construct() - da classe; perceba que o método está marcado como PRIVATE, isso indica que se tentarmos utilizar o operador new com essa classe teremos um erro de execução, EXCETO se utilizarmos internamente à classe; Na linha 6 colocamos nosso código para executar a conexão com o banco de dados. Esse código ficará dentro do método construtor; Na linha 11 definimos o método publico getInstancia(). Esse será o único método visível da classe e será responsável por recuperar o objeto instancia;
  • 15. Exemplo Na linha 12 executamos o teste condicional, se o atributo instancia for false, ou seja, no primeiro acesso à classe, ele entrará no bloco; Na linha 13 criamos uma instância da classe Conexao. Perceba que utilizamos o operador new, portanto o método __construct() será chamado, criando uma conexão com o banco de dados. Mas o método __construct() é private!! Claro, mas isso não proíbe que a PROPRIA classe acesse esse método. Somente proíbe o acesso do "lado de fora" da classe Conexao; Na linha 16 retornamos o atributo instancia. Note pelo código que o objeto instancia será criado apenas UMA vez, note também que, independentemente de onde estamos chamando a classe Conexao, o método getInstancia() retornará SEMPRE o mesmo objeto.
  • 16. Considerações Finais  Singleton:  um dos padrões mais simples,  um dos mais criticados e mal usados.  Os singletons são difíceis de escalar, pois é difícil garantir uma única instância de um singleton em um cluster, onde existem várias JVMs.  Um outro problema é que os singletons dificultam o hot redeploy por permanecerem em cache, bloqueando mudanças de configuração.  Por esses e outros problemas, deve-se ter cuidado com o uso abusivo de singletons.  CUIDADO! A utilização dos Padrões de Projetos é uma "faca de dois gumes". O abuso de Padrões pode "engessar" o projeto, dificultando sua manuntenção.
  • 17. Referências Bibliográficas  FREEMAN E.; FREEMAN. E; SIERRA, K.; BATES B. Head First: Design Patterns. Sebastopol: O’Reilly, 2001.  Padrões de Projeto: Soluções Reutilizáveis de Software Orientado a Objetos – “The Gang of Four”  http://www.elton.utfpr.net/Escola/Padrão%20Singleton.pdf  http://www.plugmasters.com.br/sys/materias/893/1/Padr %F5es-de-Projeto%3A-Singleton