Você está na página 1de 15

Projeto de Sistemas de Software

Abstract Factory
Padres de projeto
Bruno Freitas Gadelha
Setembro, 2008

Abstract Factory

Propsito
Motivao
Aplicabilidade
Estrutura
Participantes
Colaboraes
Consequncias
Exemplo
2

Abstract Factory

Propsito
Prover

uma interface para criar uma famlia


de objetos relacionados ou dependentes sem
especificar suas classes concretas

Abstract Factory

Motivao
Montadoras

Diferentes modelos

Diferentes acessrios

Gerador

de carros

de documentos

Diferentes documentos (textos, planilhas,


apresentacoes)

Diferentes estilos de documentos (cartas de


recomendao, curriculos, etc.)
4

Abstract Factory

Aplicabilidade
Um

sistema deve ser independente de como


seus produtos sao criados, compostos e
representados
Um sistema deve ser configurado como um
de mltiplas famlias de produtos

Abstract Factory

Estrutura

Abstract Factory

Participantes

AbstractFactory: Declara uma interface para a criao de


objetos abstratos.
ConcreteFactory: Implementa as operaes que criam objetos
concretos.
AbstractProduct: Declara uma interface para um tipo de objeto.
ConcreteProduct: Define um objeto a ser criado pela fbrica
concreta correspondente e implementa a interface de
AbstractProduct.
Client: Utiliza somente as interfaces declaradas pelas classes
AbstractFactory e AbstractProduct.

Abstract Factory

Colaboraes
Normalmente

uma nica instncia de uma classe


FactoryConcreta criada em tempo de execuo.
Essa FactoryConcreta cria objetos tendo uma
implementao particular. Para criar produtos
diferentes, clientes devem usar uma FactoryConcreta
diferente.
FactoryAbstrata depende de suas subclasses
FactoryConcreta para criar objetos de produtos

Abstract Factory

Consequncias
O

padro isola classes concretas


Uma factory encapsula a responsabilidade e o processo de
criao de objetos de produtos
Isola clientes das classes de implementao
O cliente manipula instncias atravs de suas interfaces
abstratas

Facilita

o cmbio de famlias de produtos

A classe da FactoryConcreta s aparece em um lugar: onde


ela instanciada
Uma mudana numa nica linha de cdigo pode ser
suficiente para mudar a FactoryConcreta que a aplicao
usa

A famlia inteira de produtos muda de uma vez


9

Abstract Factory

Consequncias
Promove

a consistncia entre produtos

Produtos de uma determinada famlia devem funcionar


conjuntamente e no misturados com produtos de outra
famlia
O padro permite implementar esta restrio com facilidade

Do

lado negativo: dar suporte a novos tipos de


produtos difcil

O motivo que a FactoryAbstrata fixa o conjunto de


produtos que podem ser criados
Dar suporte a mais produtos fora a extenso da interface
da factory o que envolve mudanas na FactoryAbstrata e em
todas suas subclasses FactoryConcreta
10

Abstract Factory

Exemplo

ProdutoAbstrato

public abstract class Document {


protected String content;
public String getContent()
{ return content;}
public abstract String getTemplate();
public abstract String getType();
}

ProdutoA1

public class SimpleLetterDocument extends Document{


public String getTemplate(){
// contedo para retornar o template deste tipo de documento}
public String getType(){
return Simple Letter; }
}

11

Abstract Factory

ProdutoA2

Exemplo

public class ProfessionalLetterDocument extends Document{


public String getTemplate(){
// contedo para retornar o template deste tipo de documento }
public String getType(){
return Pro Letter;}
}

ProdutoB1
public class SimpleSpreadSheetDocument extends
Document{
public String getTemplate(){ }
public String getType(){
return Simple Spreadsheet;}
}

12

Abstract Factory

ProdutoB2

Exemplo

public class FancySpreadSheetDocument extends Document{


public String getTemplate(){}
public String getType()
{ return Fancy Spreadsheet; }
}
public class LetterFactory{
public static Document getLetter(String style){
if(simple.equals(style))
{ return new SimpleLetterDocument(); }
if(pro.equals(style))
{ return new ProfessionalLetterDocument();}
else return null;
}
}

ConcreteFactory
p/ cartas

13

Abstract Factory

Exemplo

ConcreteFactory
p/ planilhas

public class SpreadSheetFactory{


public static Document getSpreadSheet(String style){
if(simple.equals(style))
{return new SimpleSpreadSheetDocument();}
if(fancy.equals(style))
{return new FancyLetterDocument();}
else return null;
}
}
public class DocumentFactory{
public Document getDocument(String type, String style){
if(letter.equals(type))
{return LetterFactory.getLetter(style);}
if(spreadsheet.equals(type))
{return SpreadSheetFactory.getSpreadSheet(style);}
}
}

AbstractFactory

14

Abstract Factory

Exemplo

Client

public class Cliente{


public static void main(String[] args){
Document letter1 = DocumentFactory.getDocument(letter, simple);
Document letter2 = DocumentFactory.getDocument(letter, pro);
Document sp1 = DocumentFactory.getDocument(spreadsheet, simple);
Document sp2 = DocumentFactory.getDocument(spreadsheet, pro);
System.out.println(letter1.getType()); // Simple Letter
System.out.println(letter2.getType()); // Pro Letter
System.out.println(sp1.getType()); // Simple Spreadsheet
System.out.println(sp2.getType()); // Fancy Spreadsheet
}
}

15

Você também pode gostar