abstract
TRANSCRIPT
![Page 1: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/1.jpg)
ABSTRACTFACTORY
Alan O. De Sousa
Rafael B. Cabral
![Page 2: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/2.jpg)
O que é o Abstract Factory?
• O Abstract Factory é um padrão de projeto semelhante ao Factory Method ;
• O Factory Method quer que você seja diferente (via herança) para criar objetos diferentes, o Abstract Factory quer que você tenha algo diferente.
• Abstract Factory permite satisfazer a restrição de criar apenas objetos relacionados ou dependentes
![Page 3: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/3.jpg)
Diagrama de Classes
![Page 4: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/4.jpg)
Exemplo de Código Abstract Factory//abstract factory
abstract AbstractFactory
{
public abstractBotao criarBotao();
public abstractJanela criarJanela();
}
//concrete factory
class MotifFactory extends AbstractFactory
{
public Botao criarBotao()
{
return newBotaoMotif();
}
public Janela criarJanela()
{
return newJanelaMotif();
}
}
![Page 5: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/5.jpg)
//concrete factory
class MetalFactory extends AbstractFactory{
publicBotao criarBotao() {
return new BotaoMetal();
}
publicJanela criarJanela() {
return new JanelaMetal();
}
}
//abstract product
abstract class Botao {
public abstract void desenhar();
}
![Page 6: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/6.jpg)
//product
class BotaoMotif extends Botao
{
public void desenhar() {
System.out.println("Eu sou um botao Motif!");
}
}
//product
class BotaoMetal extends Botao {
public void desenhar() {
System.out.println("Eu sou um botao do Metal!");
}
}
//abstract product
abstract class Janela
{
public abstract void desenhar();
}
![Page 7: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/7.jpg)
//product
class JanelaMotif extends Janela
{
public void desenhar() {
System.out.println("Eu sou uma janela Motif!");
}
}
//product
class JanelaMetal extends Janela
{
public void desenhar() {
System.out.println("Eu sou uma janela Metal!");
}
}
![Page 8: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/8.jpg)
//Client
public class Cliente {
public static void main(String[] args)
{
AbstractFactory factory = obterFactory(1);
Botao botao = factory.criarBotao();
botao.desenhar();
Janela janela = factory.criarJanela();
janela.desenhar();
}
public static AbstractFactory obterFactory(int tipo)
{
if(tipo == 1 ) {
return new MotifFactory();
} else {
return new MetalFactory();
}
}
}
![Page 9: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/9.jpg)
EXEMPLOS:
![Page 10: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/10.jpg)
EXEMPLOS:
![Page 11: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/11.jpg)
Quando Usar ?
• O sistema deve ser independente de como seus
produtos são criados, compostos e representados;
• O sistema deve ser configurado com uma ou com
múltiplas famílias de produtos;
• Uma família de objetos de produtos relacionados é
projetada para ser usada de forma conjunta e você deva
garantir esta restrição
• Você quer prover uma biblioteca de classes de produtos
e quer revelar apenas suas interfaces e não suas
implementações
![Page 12: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/12.jpg)
Quando Usar ?
• Deseja-se criar instâncias de um conjunto de classes
relacionadas, sem que se saiba qual classe factory
concreta deve ser instanciada;
• – Na falta de uma classe abstrata, o cliente deve manter
um critério de seleção para selecionar qual das
interfaces disponíveis deve ser usada, em tempo de
execução;
• – Ajuda a evitar duplicação de interfaces para criação
das instâncias, eliminado a necessidade da classe
cliente ter que conhecer diversas interfaces para as diversas classes concretas.
![Page 13: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/13.jpg)
Vantagens:
• AbstractFactory delega a criação de
objetos-produto a suas subclasses
ConcreteFactory;
• Normalmente uma única instância da
classe ConcreteFactory é criada. Para
criar objetos-produto diferentes, os
clientes devem usar uma fábrica concreta
diferente.
• Facilita a permuta de famílias de produtos
• Promove consistência entre produtos
![Page 14: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/14.jpg)
Desvantagens:
• Isola classes concretas
• Dificulta o suporte a novos tipos de
produtos
![Page 15: Abstract](https://reader038.vdocuments.mx/reader038/viewer/2022100519/559e7bd51a28abdf318b47b1/html5/thumbnails/15.jpg)
}