Blog do Eduardo

Tecnologia, Inovação, Negócios e muito mais...

Design Pattern Factory

Padrões de Projeto

  • 30 de Maio de 2018 às 09:00
Capa Post
Design Pattern Factory- Padrões de Projeto

Nesse posta vamos tratar de um dos padrões de projetos mais utilizados. Estamos falando do Design Pattern Factory. Utilizando essa técnica, nos possibilita trazer um maior dinâmismo ao nosso apcódigo, pois podemos criar objetos em tempo de execução, personalizando as "características" e implementações necessárias para aplicação.

Quando devo usar esse pattern?

  • Quando a lógica para construção de um objeto fica realmente difícil de confusa. Pense no trabalhão que seria, se tivéssemos que criar 10 tipos de objetos diferentes, porém que compartilham de um escopo semelhante;
  • Criação de objetos em massa, mas diferente do pattern builder, já citado nesse site aqui, que implementa parte do objeto;

Factory: é um componente que possibilita a criação em massa de objetos. Como implementar esse componente de dois “estilos” deferentes, como Factory Method e Abstract Factory. Em alguns casos podemos ainda, quando há um cenário complexo de criação divididos em etapas e transições-estados, criar uma hierarquia de Abstract Factory.

Situação-Problema

Pense por um minuto no seguinte cenário. Você precisa realizar calcular área de diferentes forma geométricas, como por exemplo: Triângulo, Retângulo, Quadrado, Trapézio e Círculo. Note que existem diferentes variáveis e diferentes formulas para cada um dos tipos citados anteriormente. Parou para pesar se tentássemos resolver esse problema da forma tradicional utilizando apenas construtores.

Caso você tenha algum dificuldade em racionalizar uma solução, com o Pattern Factory as coisas podem ficar bem mais fáceis. Para esse post, vamos usar implementa do Factory Method, abaixo segue o diagrama de classe de uma esquema genérico.

 

  • Creator (opcional): esse classe possuí a lógica para produzir o produto, porém nesse caso é classe abstrata justamente para nos proporcionar mais “flexibilidade” no polimorfismo;
  • ConcreteCreator: essa classe já possuí implementado todas as funcionalidades necessárias para ser instanciada e produzir objeto.
  • Product: esse classe possuí as características e os atributos genéricos dos produtos, porém nesse caso é classe abstrata novamente para nos proporcionar mais “flexibilidade” no polimorfismo;
  • Concrete Product: já é de fato classe que da origem ao objeto “final” que será produzindo, já contendo as características para ser instanciada;

Segue a solução do nosso situação-problema apresentada anteriormente. Fique à vontade para analisá-la:


#include <iostream> 
#include <math.h> using namespace std; // class GeometricFigure class GeometricFigure { public: static GeometricFigure * newCircle(double radio){ return new GeometricFigure(M_PI*radio*radio); } static GeometricFigure * newTrapezoid(double lb, double sb, double h){ return new GeometricFigure(0.5 * (lb + sb) * h); } static GeometricFigure * newRectangle(double b, double h){ return new GeometricFigure(b * h); } static GeometricFigure * newSquare(double b, double h){ return new GeometricFigure(b * h); } static GeometricFigure * newTriangle(double sa, double sb, double sc){ // Area of a triangle using Heron's formula double s = (sa + sb + sc)/2; return new GeometricFigure(sqrt(s*(s-sa)*(s-sb)*(s-sc))); } double getArea(){ return area; } double getArea() const{ return area; } friend ostream & operator<<(ostream &os, const GeometricFigure &inst); private: GeometricFigure(double a){ area = a; } double area; }; ostream & operator<<(ostream &os, const GeometricFigure &inst) { os << "GeometricFigure( area = " << inst.getArea() << " )" << endl; return os; } int main(){ GeometricFigure *triangle1 = GeometricFigure::newTriangle(3.0, 4.0, 5.0); GeometricFigure *triangle2 = GeometricFigure::newTriangle(4.0, 4.0, 4.0); GeometricFigure *triangle3 = GeometricFigure::newTriangle(5.0, 4.0, 5.0); GeometricFigure *rectangle = GeometricFigure::newRectangle(4.0, 5.0); GeometricFigure *square = GeometricFigure::newSquare(4.0, 4.0); GeometricFigure *trapeze = GeometricFigure::newTrapezoid(4.0, 6.0, 3.0); cout << *triangle1 << *triangle2 << *triangle3 << *rectangle << *square << *trapeze; return 0; }


 

Veja que aqui criamos uma classe genérica GeometricFigure, porém foi declarada de forma private, para justamente termos o controle da construção dos objetos. Para resolver o programa de criar uma construção diferente para cada tipo de forma geométrica criamos o métodos static new + <nome da Forma Geométrica>, justamente para separa o escopo baseado nas características necessárias para a forma. Como por exemplo no método GeometricFigure * newTrapezoid(double lb, double sb, double h).

Conclusão

O Design Pattern Factory, ilustrado nesse post é um verdadeiro curinga pois possibilita criar de maneira simples e em massa diferentes tipos de objetos.

C++ Design Pattern Programação
  • COMENTÁRIOS: 0 Seja o primeiro a comentar!

Você tem o permissão de:

Compartilhar: copiar e redistribuir o material em qualquer suporte ou formato.

Adaptar: remixar, transformar, e criar a partir do material para qualquer fim, mesmo que comercial.

Esta licença é aceitável para Trabalhos Culturais Livres. O licenciante não pode revogar estes direitos desde que você respeite os termos da licença.


Blog do Eduardo - Todos os direitos reservados © 2020 Licença Creative Commons