quinta-feira, 24 de abril de 2008

Aulas 19 e 20 - Projeto Orientado a Objetos

Padrão Singleton

O padrão Singleton assegura que apenas uma única instância daquela classe vai existir. Por exemplo, seu sistema pode ter apenas um gerenciador de janelas, ou gerenciador de impressão, ou então um único ponto de acesso ao banco de dados. A maneira mais fácil de fazer uma classe que possua uma única instância dela mesma é utilizar uma variável estática na classe, onde será guardada a referência para a instância corrente. No caso do Singleton, a classe deve ter um construtor private, ou seja, ela não poderá ser instanciada diretamente, mas sim fornecer um método comum para que a instância única da classe seja retornada. Cada vez que esse método for chamado, ele deve checar se já existe uma instância da classe e retorná-la, caso contrário ele deve instanciar a classe, guardar a referência ao objeto no atributo estático da classe e então retorná-lo

public class Singleton {

private static Singleton instance;

private Singleton() { }
public static Singleton getInstance() {

if (instance == null) instance = new Singleton();
return instance;
}
}

O código acima pode ser problemático em ambientes multi-threads, ou seja, ele não é uma solução thread-safe. Se uma thread chamar o método getInstance() e for interrompida antes de realizar a instanciação, uma outra thread poderá chamar o método e realizar a instanciação. Neste caso, duas instâncias serão construídas, o que fere os requisitos do singleton.

Utilizando atributo Synchronized

Uma solução para este problema seria utilizar o atributo synchronized em getInstance(), como visto no código abaixo, para que uma outra thread não possa acessá-lo até que a thread que o acessou pela primeira vez tenha terminado de executar.

public class Singleton {
private static Singleton instance; private Singleton() { }
public static synchronized Singleton getInstance()
{ if (instance == null) instance = new Singleton();
return instance;
}
}

Problemas com Synchronized

O problema com o synchronized é que a sincronização é bastante custosa. Estima-se que métodos sincronizados sejam cerca de cem vezes mais lentos que métodos não sincronizados.Uma alternativa simples, rápida e thread-safe é a instanciação do singleton assim que ele for declarado.

public class Singleton {

private static Singleton instance = new Singleton(); private Singleton() { }
public static Singleton getInstance() {
return instance;
}
}


Bibliografia

Marcoratti - O padrão Singleton <http://www.macoratti.net/net_psgt.htm> Acessado em 23 Abr 2008, 13:31;

Universia - Padrões de Projeto <http://www.universia.com.br/mit/6/6.170/pdf/6.170_lecture-12.pdf> Acessado em 23 Abr 2008, 13:25;

Wikipedia Singleton <http://pt.wikipedia.org/wiki/Singleton> Acessadp e 23 Abr 2008, 13:55;

quinta-feira, 17 de abril de 2008

Aulas 17 e 18 - Projeto Orientado a Objetos

Padrões GOF


Padrão GOF contém 23 padrões e algumas formas de classificação são elas: criação, estrutura e comportamento, sendo que a criação está relacionando na criação propriamente dita na criação do objeto, a estrutura nos mostra as associações entre as classes e objetos e o comportamento divide as responsabilidades entre as classes ou objetos.
Os padrões GOF está voltado também na qualidade de um software usando o conceito de herança, polimorfismo, modularidade, composição e abstração, a alta coesão e o baixo acoplamento é um fator importante nos padrões GOF para satisfazer a qualidade do software.
Metsker classifica os padrões GOF como:


· Interface – é o meio que liga uma classe ou objeto através de um adaptador;


· Responsabilidade – atribui responsabilidade as classes e objetos, também utilizados nos padrões GRASP;


· Construção – e a construção propriamente dita de uma classe, por exemplo: fabricam instâncias Building;


· Operação – parte de métodos das classes;


· Extensão – Extensibilidade, polimorfismo.


Padrão Interface – Adapter


Adapter, também conhecido como Wrapper, é um padrão de projeto de software ou de desenho (do inglês design pattern). Este padrão é utilizado para 'adaptar' a interface de uma classe. O Adapter permite que classes com interfaces incompatíveis possam interagir.
Adapter permite que um objeto cliente utilize serviços de outros objetos com interfaces diferentes por meio de uma interface única


Podemos ter a seguinte situação:


















O Cliente precisa comunicar-se com o Adaptado, mas possuem interfaces incompatíveis. Então, ele comunica-se com o Adapter, fazendo a este uma solicitação. O Adapter repassa a solicitação para o Adaptado. O Adaptado precisa então devolver uma resposta para o Cliente, mas novamente não é possível devido à incompatibilidade de interfaces. A solução é enviar a resposta para o Adapter que irá em seguida encaminhá-la para o Cliente, completando assim o ciclo de comunicação. O adapter é encarregado de fazer o meio entre as classes que não se comunicam dando uma flexibilidade as classes que não são compatíveis umas com as outras.



Em seguida podemos observar um código que representa o padrão Adapter:


//Classe Cliente


public class cliente extends Adaptador{

public static void main(String[] args) {


cliente c = new cliente(); c.executa();


}

}




//Classe Adaptador



public class Adaptador {

public void executa(){


Resultado a = new Resultado();

a.metodo();
}


}




//Classe Resultado


public class Resultado {


public void metodo(){


System.out.println("Resultado da Oeracao")

}


}


Nesse caso foi utilizado as classes Cliente, Adaptador e Resultado, para representadar o padrão Adapter.




Bibliografia

Christopher Alexander. A Pattern Language. Estados Unidos da América: Oxford University Press, 1977. ISBN 0195019199

JEEBrasil Padrão de projeto Adapter <http://www.jeebrasil.com.br/mostrar/38> Acessado em 16 de Abr de 2008.

Wikipedia Adapter <http://pt.wikipedia.org/wiki/Adapter> Acessado em 16 de Abr de 2008.