Padrões Criacionais
Notação
Notação de Classes e Objetos referencia objeto ClasseAbstrata agrega um ClasseConcreta operaçãoabstrata() cria muitos SubclasseConcreta1 operação() variáveldeinstância SubclasseConcreta2 pseudo código umobjeto referênciaaobjeto outroobjeto variáveldeinstância
Diagrama de Interação de Objetos umobjeto outroobjeto TEMPO operação ativa sobre o objeto outroobjeto = new Objeto() (instanciação) outroobjeto.método() this.método()
Padrões Criacionais AbstractFactory - Fábrica Abstrata Builder - Construtor FactoryMethod - Método Fabricante Prototype - Protótipo Singleton - Solitário
Padrões Criacionais Em vez de codificar um conjunto fixo de comportamentos em várias classes e poucos objetos, codificar um pequeno conjunto de comportamentos fundamentais e compô-los em um grande número de formas complexas Adquirem mais importância à medida em que o sistema passa a depender mais da composição de objetos do que de herança Agregação em detrimento de especialização
Padrões Criacionais (1/2) AbstractFactory - Fábrica Abstrata (Object) Provê uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. Builder - Construtor (Object) Separa construção da representação de um objeto complexo, de modo que o mesmo processo de construção possa criar diferentes representações. FactoryMethod - Método Fabricante (Class) Define uma interface para criação um objeto, mas deixa subclasses decidir quais classes instanciar. Permitindo a uma classe delegar instanciação a subclasses.
Padrões Criacionais (2/2) Prototype - Protótipo (Object) Especifica que tipos de objetos criar usando uma instância prototípica, e cria novos objetos através da cópia deste protótipo. Singleton - Solitário (Object) Garante que uma classe possui apenas uma única instância, e provê um ponto global de acesso a ela.
Padrão AbstractFactory
Padrão AbstractFactory Meta Provê uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. Motivação Muitas vezes um programa necessita criar famílias inteiras de objetos que se relacionam apenas entre si As diferentes famílias de objetos apresenta mesma estrutura comum, mas não se relaciona com as outras famílias Exemplo: Suporte a múltiplos look and feel do pacote java.awt
AbstractFactory Estrutura do Padrão client AbstractFactory createproducta() createproductb() abstractproducta producta2 producta1 ConcreteFactory1 createproducta() createproductb() ConcreteFactory2 createproducta() createproductb() abstractproductb productb2 productb1
AbstractFactory Participantes AbstractFactory Declara uma interface para operações que criam objetos (produtos) abstratos ConcreteFactory Implementa a operações para criar objetos (produtos) concretos AbstractProduct Declarea uma interface para um tipo de objeto (produto) ConcreteProduct Define um objeto (produto) para ser criado pela ConcreteFactory correspondente Client Usa apenas interfaces declaradas pela AbstractFactory e AbstractProduct
AbstractFactory Aplicabilidade Use o Padrão AbstractFactory quando: Um sistema deve ser independente de como seus produtos são criados, compostos e representados Um sistema deve ser configurado com uma entre múltiplas famílias de produtos Uma família de produtos foi projetada para trabalhar em conjunto e você necessita garantir o comprimento destas restrições Você quer fornecer uma biblioteca de produtos (biblioteca ou framework), mas quer revelar apenas as interfaces dos produtos, mas não suas implementações
AbstractFactory Colaborações Normalmente uma única instância de uma fábrica concreta é criada em run-time Esta fábrica concreta cria objetos (produtos) com uma implementação particular Para criar produtos diferentes, clientes devem usar fábricas concretas diferentes A AbstractFactory transfere a criação de objetos para as suas subclasses (ConcreteFactory)
AbstractFactory Conseqüências Isola Fábricas Concretas Facilita a Substituição de Famílias de Produtos Promove Consistência Entre Produtos Suporte a Novos Tipos de Produtos é Difícil
AbstractFactory Exercícios Elabore um programa para exercitar a criação do padrão AbstractFactory O cliente é um Motorista. Ele solicita à fábrica a criação de um automóvel que tem um motor e pneus. O Cliente entra no automóvel, liga o motor, e eventualmente fura um pneu A Fábrica Abstrata cria Automóveis com Pneus e Motores As Fábricas Concretas são VW e Ford, que criam automóveis Gol e Ka, respectivamente. Os Pneus da VW são Goodyear, enquanto os Pneus da Ford são Firestone O Motor VW é AP, enquanto que a Ford usa CHT Quando o Motorista entra no GOL ele faz um barulho BRUM!, Ka faz um barulho TREM!. O Motor AP faz um barulho AP Ligado, O Motor CHT faz um barulho CHT ligado Pneu Goodyear quando fura faz um barulho Chash!, Pneu Firestone quando fura faz um barulho TCHEEE!.
Padrão Builder
Padrão Builder Intenção Separar construção da implementação de um objeto complexo, de modo que o mesmo processo de construção possa criar várias representações diferentes Motivação Um programa muitas vezes necessita ler um formato de documento (fonte) e convertê-lo em vários outros formatos diferentes (objeto). Se os formatos (objeto) não são definidos a priori, é possível configurar o programa com um conversor (builder) que pode ser especializado em diferentes formatos e operações de conversão
Padrão Builder Estrutura e Participantes Director builder AbstractBuilder builders construct() buildpart*() for all objects in structure { builder.buildpart*(); } ConcreteBuilder buildpart*() getresult() ConcreteBuilder buildpart*() getresult() ConcreteBuilder buildpart*() getresult() Product Product Product
Padrão Builder Colaborações aclient adirector abuilder abuilder = new ConcreteBuilder() adirector = new Director(aBuilder) adirector.construct() umbuilder.buildparta() umbuilder.buildpartb() umbuilder.buildpartc() abuilder.getresult()
Padrão Builder Aplicabilidade e Conseqüências Use o Padrão Builder Quando O algoritmo para criar um objeto complexo deve ser independente das partes que constróem o objeto e de como elas são montadas O processo de construção necessita fornecer representações diferentes para o objeto que é construído Conseqüências do Padrão Builder Permite variar a representação interna de um produto Isola os códigos de construção e representação Permite controle fino sobre o processo de construção
Padrão Builder Exercícios Elabore um programa para exercitar a criação do padrão Builder O AbstractBuilder é um Metalúrgico. Os ConcreteBuilder são de dois tipos MetalúrgicoBrasileiro e MetalúrgicoAlemão MetalúrgicoBrasileiro constrói um carro Gol com motor de aço e pneus de borracha natural. MetalúrgicoAlemão usa constrói um carro BMW com motor de alumínio e pneus de silicone. O Director é a fábrica, que receber um Builder qualquer (Mecânico) e deixa para o mecânico a tarefa de construir as partes do carro. A fábrica conecta as partes produzidas pelo mecânico.
Padrão FactoryMethod (VirtualConstructor)
Padrão FactoryMethod Intenção Definir uma interface para criação de um objeto, mas deixar que subclasses decidam as classes dos objetos a instanciar Motivação Frameworks para criação de aplicações que trabalham sobre documentos necessitam serem refinados para definir exatamente qual a aplicação a ser criada, e qual o tipo de documento sobre a qual ela vai trabalhar
Padrão FactoryMethod Estrutura e Participantes Product Creator factorymethod() operation()... Product = factorymethod();... ConcreteProduct ConcreteCreator factorymethod() return new ConcreteProduct();
Padrão FactoryMethod Aplicabilidade e Conseqüências Use o Padrão FactoryMethod quando: Uma classe não pode antecipar qual a classe do objeto que ela deve criar. Uma classe quer que suas subclasses definam o objeto que elas criam Classes delegam responsabilidades para uma entre muitas subclasses auxiliares, e você quer limitar o conhecimento de qual subclasse auxiliar recebeu a delegação. Conseqüências Eliminam a necessidade de ligar classes específicas ao código Clientes necessitam criar subclasses sempre que precisam criar produtos Fornecem ganchos para subclasses Conectam hierarquias de classes paralelas
Padrão FactoryMethod Exercícios Elabore um framework ProtoOficinaDeMontagemDeMotores e dois programas (que implementam o framework) para exercitar a criação do padrão FactoryMethod O AbstractProduct é um Motor. Os ConcreteProduct são MotorDeAço e MotorDeAlumínio Motor de alumínio só pode ser de 3 ou 6 cilindros Motor de aço pode ser de 4 ou 8 cilindros Selecionar o # de cilindros através de um diálogo. O Creator é o Metalúrgico MetalúrgicoAlemão cria motores de alumínio. MetalúrgicoBrasileiro cria motores de aço. Após ter os dois programas criados, crie um terceiro, que usa um MotorElétrico e um MetalúrgicoJapones.
Padrão Prototype
Padrão Prototype Intenção Especificar os tipos de objetos a criar usando uma instância prototípica, e criar novos objetos através da clonagem deste protótipo Motivação Você deseja parametrizar o funcionamento de uma parte da aplicação (ToolBar, por exemplo) mas não quer usar herança, pois a quantidade de subclasses diferentes seria muito grande
Padrão Prototype Participantes e Colaboradores Cliente operation() Prototype clone()... p = prototype.clone();... ConcretePrototype1 clone() ConcretePrototype2 clone()
Padrão Prototype Aplicabilidade Use o Padrão Prototype Quando: Um sistema deve ser independente de como seus produtos são criados, compostos e representados, e Quando as classes a instanciar são especificadas em runtime, por exemplo, através de carga dinâmica, ou; para evitar construir uma hierarquia de fábricas que é paralela à hierarquia de produtos, ou; Quando instâncias de uma classe podem ter apenas poucas combinações de estados. Fica então mais conveniente clonar objetos em vez de construir novos objetos
Padrão Prototype Conseqüências Reduz o número de classes que os clientes conhecem Permitem Que o cliente trabalhe com classes específicas de uma aplicação, sem necessidade de recompilação Adicionar e remover produtos em run-time Aspecificar novos objetos através da variação de valores Especificar novos objetos através de variação na estrutura Reduzir o número de subclasses Configuração dinâmica de aplicações Cada subclasse deve implementar o método clone()
Padrão Prototype Exercícios Elabore um programas para exercitar a criação do padrão Prototype O Cliente é um revendedor de automóveis VW. O (Abstract)Prototype é um modelo de automóvel GOL Os ConcretePrototype são modelos de Automóveis GOL Modelo Luxo Gol com Motor AP de 250HP e Pneus 13/185 Modelo Standard Gol com Motor AP de 180HP e Pneus 13/ Crie uma aplicação de venda de automóveis que vende Gol através da clonagem dos modelos Luxo e Standard
Padrão Singleton
Padrão Singleton Intenção Garantir que uma classe contenha apenas uma instância e prover um ponto de acesso global a esta instância. Motivação Praticamente todo sistema possui uma classe que deve ter apenas uma única instância. Uma alternativa comumente usada em Java é tratar a classe como esta instância Em muitas situações o padrão Singleton é mais indicado
Padrão Singleton Estrutura e Participantes Singleton static instance() singletonoperation() getsingletondata()... return uniqueinstance;... Static uniqueinstance; singletondata;
Padrão Singleton Aplicabilidade e Conseqüências Use o padrão Singleton quando: Deve existir exatamente uma instância de uma classe, e ela deve ser acessível a partir de um ponto bem conhecido Quando esta única instância precisa ser extensível através de herança, e clientes devem estar aptos a usa uma classe estendida sem modificar seu código. Conseqüências Acesso controlado a uma única instância Espaco de nomes reduzido Permite o refinamento de operações e representação Permite variar o número de instâncias Mais flexível que operações de classes
Padrão Singleton Exercícios
Discussão sobre Padrões Criacionais AbstractFactory Builder FactoryMethod Prototype Singleton
Padrões Criacionais Em vez de codificar um conjunto fixo de comportamentos em várias classes e poucos objetos, codificar um pequeno conjunto de comportamentos fundamentais e compô-los em um grande número de formas complexas Adquirem mais importância à medida em que o sistema passa a depender mais da composição de objetos do que de herança Agregação em detrimento de especialização
Padrões Criacionais De Classe Baseados no uso de herança FactoryMethod De Objeto Baseados no uso de delegação AbstractFactory, Builder, Prototype, Singleton
Temas Recorrentes em Padrões Criacionais Encapsulam conhecimento acerca de qual classe concreta o sistema utiliza Todo o resto do sistema conhece os objetos apenas por suas interfaces abstratas Escondem como instâncias destas classes são criadas e agregadas
Padrões Criacionais Permite flexibilidade sobre o quê é criado quem o cria como ele é criado quando é criado As configurações podem ser definidas de modo estático (tempo de compilação) ou dinâmico (runtime)
Fim