1 / 15

Abstract Factory

Projeto de Sistemas de Software. Abstract Factory. Padr ões de projeto. Bruno Freitas Gadelha Setembro, 2008. Abstract Factory . Propósito Motivação Aplicabilidade Estrutura Participantes Colaborações Consequências Exemplo. Abstract Factory. Propósito

shaman
Download Presentation

Abstract Factory

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Projeto de Sistemas de Software Abstract Factory Padr ões de projeto Bruno Freitas Gadelha Setembro, 2008

  2. Abstract Factory • Propósito • Motivação • Aplicabilidade • Estrutura • Participantes • Colaborações • Consequências • Exemplo

  3. Abstract Factory • Propósito • Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas

  4. Abstract Factory • Motivação • Montadoras de carros • Diferentes modelos • Diferentes acessórios • Gerador de documentos • Diferentes documentos (textos, planilhas, apresentacoes) • Diferentes estilos de documentos (cartas de recomendação, curriculos, etc.)

  5. 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 múltiplas famílias de produtos

  6. Abstract Factory • Estrutura

  7. Abstract Factory • Participantes • AbstractFactory: Declara uma interface para a criação de objetos abstratos. • ConcreteFactory: Implementa as operações que criam objetos concretos. • AbstractProduct: Declara uma interface para um tipo de objeto. • ConcreteProduct: Define um objeto a ser criado pela fábrica concreta correspondente e implementa a interface de AbstractProduct. • Client: Utiliza somente as interfaces declaradas pelas classes AbstractFactory e AbstractProduct.

  8. Abstract Factory • Colaborações • Normalmente uma única instância de uma classe FactoryConcreta é criada em tempo de execução. Essa FactoryConcreta cria objetos tendo uma implementação particular. Para criar produtos diferentes, clientes devem usar uma FactoryConcreta diferente. • FactoryAbstrata depende de suas subclasses FactoryConcreta para criar objetos de produtos

  9. Abstract Factory • Consequências • O padrão isola classes concretas • Uma factory encapsula a responsabilidade e o processo de criação de objetos de produtos • Isola clientes das classes de implementação • O cliente manipula instâncias através de suas interfaces abstratas • Facilita o câmbio de famílias de produtos • A classe da FactoryConcreta só aparece em um lugar: onde ela é instanciada • Uma mudança numa única linha de código pode ser suficiente para mudar a FactoryConcreta que a aplicação usa • A família inteira de produtos muda de uma vez

  10. Abstract Factory • Consequências • Promove a consistência entre produtos • Produtos de uma determinada família devem funcionar conjuntamente e não misturados com produtos de outra família • O padrão permite implementar esta restrição com facilidade • Do lado negativo: dar suporte a novos tipos de produtos é difícil • O motivo é que a FactoryAbstrata fixa o conjunto de produtos que podem ser criados • Dar suporte a mais produtos força a extensão da interface da factory o que envolve mudanças na FactoryAbstrata e em todas suas subclasses FactoryConcreta

  11. Abstract Factory ProdutoAbstrato • Exemplo 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(){ // conteúdo para retornar o template deste tipo de documento} public String getType(){ return “Simple Letter”; } }

  12. Abstract Factory ProdutoA2 • Exemplo • public class ProfessionalLetterDocument extends Document{ • public String getTemplate(){// conteúdo 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”;} • }

  13. Abstract Factory ProdutoB2 • Exemplo • public class FancySpreadSheetDocument extends Document{ • public String getTemplate(){…} • public String getType() • { return “Fancy Spreadsheet”; } • } ConcreteFactory p/ cartas • 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; • } • }

  14. Abstract Factory ConcreteFactory p/ planilhas • Exemplo • 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; • } • } AbstractFactory • 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);} • } • }

  15. Abstract Factory Client • Exemplo • 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 • } • }

More Related