150 likes | 254 Views
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
E N D
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 • Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas
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.)
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
Abstract Factory • Estrutura
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.
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
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
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
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”; } }
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”;} • }
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; • } • }
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);} • } • }
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 • } • }