Escolar Documentos
Profissional Documentos
Cultura Documentos
Uma
Caracterização Bibliográfica
Abstract—This essay presents an introduction, soluções foram dividas em 3 grupos: criacional, estrutural e
differentiation, study and contextualization of the applicability comportamental.
of the object-oriented Design Pattern, Factory Method. The
strategy to arrive at the analysis and framing of the use cases Dentre os padrões criacionais, um de extrema
where it can be used is based on the perception of the problems importância foi destilado: o Factory Method, também
it solves, using theoretical and practical scenarios as support. conhecido como Construtor Virtual. Trata-se de um Design
The analysis with other Design Patterns is done in order to Pattern onde o escopo é feito nas classes e não nos objetos.
demonstrate the Factory Method's differentiation from other Assim sendo, define uma interface para criar um objeto,
alternatives. The research carried out also compares different deixando as subclasses decidirem qual classe instanciar.
implementations and structuring in terms of code and
application design. The results demonstrate the applicability O Factory Method permite que uma classe adie a
and flexibility of this Pattern in different projects, allowing to instanciação para subclasses. É, portanto, uma “Fábrica de
observe the possibility of reusing its structure in different Métodos”, onde uma superclasse agrega funcionalidades
solutions or other Patterns. gerais e as subclasses encapsulam procedimentos
específicos.
Keywords—Factory Method, Design Patterns, Object-
Oriented Techniques, Java, Abstract Factory, Prototype
Ao longo deste ensaio, serão trabalhadas implicações,
abordagens e possíveis utilizações deste design num estudo
Resumo—Este ensaio apresenta uma introdução, de carácter teórico e prático, com o objetivo de alcançar uma
diferenciação, estudo e contextualização da aplicabilidade do compreensão sobre o Design Pattern.
Design Pattern, orientado a objetos, Factory Method. A
estratégia para chegar à análise e enquadramento dos casos de II. ESTRUTURAÇÃO
uso onde pode ser usado é baseada através da perceção dos
problemas que resolve, utilizando para tal cenários teóricos e Para o sucesso do Factory Method é necessário declarar
práticos como suporte. A análise com outros Design Patterns é uma interface A, comum para todos os objetos que podem
feita com o intuito de demonstrar a diferenciação do Factory ser produzidos pela hierarquia de uma superclasse B. Os
Method perante outras alternativas. A pesquisa realizada herdeiros desta superclasse B podem implementar diferentes
compara, também, diferentes implementações e estruturações implementações da interface A.
ao nível de código e desenho da aplicação. Os resultados
demonstram a aplicabilidade e flexibilidade deste Pattern em
A superclasse B declara um método abstrato, Factory
diferentes projetos, permitindo observar a possibilidade de
Method, que irá retornar um novo objeto que implementa a
reutilizar sua estrutura em diferentes soluções ou outros interface A. No final, obtêm-se várias classes finais
Patterns. reescrevendo a base do método para que retorne diferentes
tipos de produtos.
A. Aplicabilidade
I. INTRODUÇÃO
O Factory Method pode ser usado em situações onde uma
Ao longo da história do desenvolvimento de software, classe não consegue antecipar a classe do objeto que deve
várias abordagens sobre como estruturar o Código para criar, ou pretende que a sua subclasse especifique o objeto
resolução de problemas foram e continuam sendo que cria. Deve, também, ser usado para quando se pretende
concebidas. No entanto, em outubro de 1994, um grupo saber qual subclasse helper está delegado.
composto por 4 pesquisadores da área da computação, cujo
grupo ficou popularmente conhecido como GoF – Gang of Como este é um método que se baseia em hierarquias,
Four, elaborou o livro intitulado “Design Patterns: Elements torna a implementação de novos componentes que estendem
of Reusable Object-Oriented Software”. É possível e/ou complementam componentes já presentes num processo
compreender, nesta literatura, o termo Design Pattern como mais facilitado, o que leva a uma maior compreensão e
“[…] descrição de comunicação de classes e objetos que são redução de tempo de correção de erros.
customizados para resolver um problema geral de design em Por este se basear fortemente em hierarquias, torna o
um contexto particular” [1]. reuso de objetos já existentes mais fácil, o que faz com que
Neste, enumeraram originalmente um total de vinte e três se poupe em recursos de sistema, uma vez que não é preciso
padrões de design orientado a objetos, cada um com o intuito estra a reconstruir estes.
de ser uma solução genérica e reutilizável para um
determinado problema no contexto de design de software. As
2022 IEEE
B. Participantes exemplo, manipular interactivamente uma figura, será
Existem 4 principais participantes, sendo o primeiro o necessário armazenar e atualizar diversas informações que
produto, que define a interface de objetos que o Factory são armazenadas, que é apenas necessário durante este
Method cria. O segundo, ConcreteProduct, fica responsável processo de manipulação. Com este problema, seria
por implementar a interface do produto. O Creator fica vantajoso usar uma classe própria para a manipulação, com
responsável por declarar o Factory Method, que retorna um um objeto para começar o estado de manipulação, com
objeto do tipo Product. Este pode, também, chamar o Factory subclasses para diferentes manipulações.
Method para criar um objeto do tipo Product. Por fim, o
ConcreteCreator faz override do Factory Method para III. USOS NA INDÚSTRIA
retomar uma instância de um ConcreteProduct. O Factory Method é preferível, em relação a outros
Design Patterns, uma vez que este define uma interface que
C. Panorama está encarregue de criar um objeto, que deixa subclasses
Considerando os participantes citados, monta-se um decidir qual classe instanciar.
modelo de estruturação a ser seguido, de forma a garantir a
Com a popularidade e eficiência deste Factory Method,
colaboração entre os diferentes participantes. Esta
várias frameworks e modos padrões de executar uma
colaboração dá-se pelo criador depender de suas subclasses
atividade foram surgindo. Muitos destes são padrões e
para definir o Factory Method, para que assim ele possa
referência para a indústria de software e é possível notar,
retornar uma instância de um produto concreto apropriado.
desta forma, que há muitos anos o Factory Method tem usos
relevantes no mercado.
Estas frameworks são, por exemplo, a .NET, com classes
como System.Data.Common. Quanto ao Java, temos a classe
DocumentBuilderFactoryQuant. Nos sistemas Apple, temos
a implementação de uma aplicação que permite desenhar
uma interface gráfica que apresente documentos através do
MacApp. Já para a criação de GUIs multiplataforma, o Qt,
Fig. 1: Estrutura Proposta Para o Design Pattern Factory Method [1] software bastante estabelecido no mercado, utiliza este
Design Pattern numa funcionalidade central – criação de
A classe Product não permite instanciação, por ser Popups personalizados.
abstrata. Por isto, é necessário criar classes concretas que a A seguir, segue-se a aplicação do Factory Method em
herdem. O mesmo pode ser dito da classe Creator, e cada uma das frameworks e soluções enumeradas.
consequentemente, do método FactoryMethod. Assim, a
implementação do método é dada nas classes concretas, que A. ADO.NET 2.0
selecionam via escopo de classe qual classe do tipo Product
deve ser instanciada. ADO.NET 2.0, foi introduzido como um namespace para
a classe System.Data.Common, para a framework .NET, da
É possível notar, também, que chamadas do método Microsoft, com o objetivo de tratar informações, data,
abstrato FactoryMethod podem ser realizadas em outros incluindo classes abstratas básicas, como DbConnection,
lugares da classe abstrata Creator, sem prejuízo de DbCommand e DbDataAdapter. [16]
funcionalidades, garantindo assim maior abstração e
facilidade no momento de instanciar objetos. A classe DbProviderFactories oferece métodos estáticos
para que se possa criar a instância DbProviderFactory, que
Formula-se, deste modo, uma esquematização estrutural vai ficar responsável por retornar objetos baseados nas
tanto do modelo conceitual quanto do prático. No modelo da informações provindas e na string conectada.
Fig.1, o desenho é baseado em classes, seus relacionamentos,
e.g, herança, e chamadas de métodos como conexão entre as B. DocumentBuilderFactory
classes Creator e Product.
A classe DocumentBuilderFactory, do Java, tem como
função definir a API fábrica, que permite aplicações a obter
D. Consequências
parsers que produzem árvores dos objetos de DOM, a partir
O Factory Method elimina a necessidade de vincular de documentos XML. Esta classe é publica e abstrata, que
classes específicas da aplicação no código, conecta estende outra classe, Object, que é a raiz da hierarquia. [17]
hierarquias de casses paralelas e prevê hooks para as [18]
subclasses. Uma possível desvantagem é que clientes podem
ter de instanciar subclasses da classe Creator apenas para C. Qt
criar um objeto de um Concrete Product em particular.
O Qt é um software multiplataforma para a criação de
Uma das grandes consequências de utilizar o Factory interfaces gráficas (GUI – Graphic User Interfaces) e
Method, é a flexibilidade em criar objetos em classes, ao aplicações multiplataforma que correm em diversos sistemas,
invés de criar este objeto diretamente, uma vez que é tais como Windows, Linux, MacOS, Android e sistemas
fornecido hooks para subclasses, para que possam estender embarcados (Embedded Systems) com pouca ou nenhuma
versões de objetos. necessidade de mudança na base de código interna, enquanto
permite aceder a funcionalidades e velocidade nativas [19].
No momento que uma classe delega uma porção das suas
responsabilidades para uma separação de classes, é gerado Numa de suas principais classes, QMainWindow,
uma hierarquia de classes paralelas. Quando se pretende, por responsável pela criação da janela principal, o método
createPopupMenu é um Factory Method declarado distintas hierarquias, algo característico no Factory
internamente na framework, mas que pode ser sobrescrito no Method.[15]
código da própria aplicação. Este método é responsável por
criar um menu de popup padrão, mas pode ser personalizado V. IMPLEMENTAÇÃO
através do overriding.
De forma a propor uma implementação prática do
D. Sistemas Apple Factory Method para exemplificar a utilização e,
consequentemente, facilitar o entendimento, é feita a
No contexto de uma aplicação para desenhar uma elaboração de um cenário com determinado problema. Será
interface gráfica, onde precisa desenhar um determinado seguido de uma análise, identificação dos participantes,
documento, uma futura subclasse Documento a instanciar estrutura e código necessário para devido funcionamento da
depende do tipo da aplicação. amostragem. A plataforma de desenvolvimento foi a IDE
Assim, a classe Aplicação não consegue definir qual NetBeans, da Oracle. A linguagem de programação utilizada
subclasse de Documento instanciar. Isto cria um dilema, uma foi Java versão 19.
vez que o projeto deve permitir instanciar classes, mas este Design Patterns do catálogo GoF costumam independer
apenas conhece as classes abstratas [1]. da linguagem de programação, desde que esta seja orientada
Para resolver este dilema, o Factory Method encapsula o a objetos. Existem algumas exceções, por exemplo a
conhecimento de qual subclasse Documento criar e move o linguagem Go, que não possui classes e objetos. Ao invés
conhecimento para fora da Framework, abstraindo a solução. disso, as estruturas (Structs) de dados podem ter métodos
declarados associados, permitindo assim a implementação
O Factory Method é encontrado em diversas frameworks dos diversos padrões, com adaptação às suas limitações [9].
deste tipo, em especial no MacApp, que permite, dentre
outras funcionalidades, desenhar interfaces gráficas em A. Contexto
diversos ambientes da Apple, especificamente nos MacOS
clássicos. Apesar de antigo, é um bom exemplo de caso de Pretende-se implementar uma aplicação multiplataforma,
uso deste Design Pattern. ou seja, deve rodar em várias plataformas, nomeadamente
Windows ou Android. A aplicação, deve, primariamente,
permitir criar e enviar notificações independentemente da
IV. DIFERENCIAÇÃO plataforma.
Alguns Design Patterns guardam semelhanças com o Cada notificação deve ser composta, minimamente, de
Factory Method, mas são utilizados em contextos e com um método para suportar o evento de clique do botão e,
finalidades diferentes. A seguir seguem diferenciações com principalmente, um método que permita enviar a notificação,
alguns destes Patterns. sendo o conteúdo passado via parâmetro.
android.SendNotification("Mensagem
public class WindowsNotification de Teste 1");
implements Notification{
System.out.println("Windows
notification clicked"); E. Discussão sobre a implementação
Com a base de código definida, é possível notar algumas
} relações características do Factory Method, principalmente
referentes à conexão das duas hierarquias.
} O método responsável por manufaturar os objetos, ou
seja, o Factory Method em si, pode ser identificado
facilmente como o método CreateNotification. Este é
public class AndroidNotification abstrato na classe Application, que delega às suas subclasses
implements Notification{ decidirem qual tipo de Notificação instanciar. (Lista 1)
Isto possui algumas implicações convenientes a nível de
aplicação de conceito no código. Isto é, no caso de haver um
@Override método dentro da classe Application que crie e utilize uma
public void send(String msg) { notificação, este não consegue saber qual tipo de notificação
deve ser tratada – Windows ou Android. Assim, é possível
System.out.println("Sending notar uma das consequências deste Pattern: a providência de
message on Android: " + msg); hooks para subclasses, fazendo com que estas decidam qual
} tipo de notificação enviar.
No método SendNotification, da classe Application, é
instanciada uma nova aplicação, que será resultado da função
@Override abstrata CreateNotification. Como métodos abstratos não
public void onClick() { podem ser instanciados, a delegação de criação de
notificações para as subclasses torna-se evidente, pois são
System.out.println("Android elas que devem implementar a funcionalidade. Assim, o
notification clicked"); método SendNotification faz a chamada de envio da
} notificação mesmo sem conhecer a classe concreta com a
qual trabalha.
O desenho da implementação, Fig. 2, abaixo
} representado, tem fortes referências à estrutura padrão do
Design Pattern, descrito na secção II.
VIII. REFERÊNCIAS
[1] Helm, R., Johnson, R., Vlissides, J., & Booch, G. (1994). Design
Patterns: Elements of Reusable Object-Oriented Software (1st ed.).
Fig. 2: Diagrama de Classes da Implementação Addison-Wesley Professional.
[2] Wikipedia contributors. (2022a, August 3). Design Patterns.
Desta forma, ao rodar o programa da função main (Lista Wikipedia. https://en.wikipedia.org/wiki/Design_Patterns
3), a mensagem de teste 1 é enviada pelo sistema Android e a [3] Wikipedia contributors. (2022c, October 21). Software design pattern.
mensagem de teste 2 é enviada pelo sistema Windows, Wikipedia. https://en.wikipedia.org/wiki/Software_design_pattern
provando o sucesso da implementação, apresentado na Fig. [4] Refactoring.Guru. (2022b, January 1). Factory Method.
https://refactoring.guru/design-patterns/factory-method
3.
[5] Rost, J. (2004). Is “Factory Method” really a pattern? ACM
SIGSOFT Software Engineering Notes, 29(5), 1–1.
https://doi.org/10.1145/1022494.1022519
[6] Paolo, Í. F. D., Cordeiro, T. D., Sena, J. A. S., Fonseca, M. C. P., Jr,
W. B., Barreiros, J. A. L., Silva, O. F., Rodrigues, É. S., Pardauil, A.
A. B., & Moreira, D. C. ([s.d.]). PADRÃO DE PROJETO FACTORY
METHOD APLICADO À MODELAGEM E ESTUDOS DA
Fig. 3: Valores de Saída ao Executar o Programa
DINÂMICA DE SISTEMAS ELÉTRICOS DE POTÊNCIA.
[7] Ellis, B., Stylos, J., & Myers, B. (2007). The Factory Pattern in API
Design: A Usability Evaluation. 29th International Conference on
VI. CONCLUSÃO Software Engineering (ICSE’07), 302–312.
https://doi.org/10.1109/ICSE.2007.85
Ao fim deste ensaio, são explicitados resultados
conceptuais a nível de definição e localização do Factory [8] Chantarasathaporn, K., & Srisa-an, C. (2006). Energy conscious
factory method design pattern for mobile devices with C# and
Method como solução reutilizável de problemas. intermediate language. Proceedings of the 3rd International
Conference on Mobile Technology, Applications & Systems -
A exposição da estrutura, diferença entre outros padrões Mobility ’06, 29. https://doi.org/10.1145/1292331.1292364
e usos na indústria permitem uma ampla e clara visão da
[9] Refactoring.Guru. (2022, January 1). Factory Method in Go.
relevância e cenário em qual se enquadra e pode ser https://refactoring.guru/design-patterns/factory-method/go/example
utilizado, bem como definir conceitos teóricos referentes ao [10] What are the differences between Abstract Factory and Factory
Factory Method. design patterns? (2011, April 21). Stack Overflow.
https://stackoverflow.com/questions/5739611/what-are-the-
Através da proposta de implementação, fica differences-between-abstract-factory-and-factory-design-patterns
exemplificada a formulação a nível de código, embarcando a [11] Satpathy, S. (2022, July 6). Difference between Factory and Abstract
componente prática com uma análise do problema do ponto Factory | bitMountn. Medium.
de vista teórico, comparando possíveis alternativas presentes https://medium.com/bitmountn/factory-vs-factory-method-vs-
no catálogo GoF e explicando o porquê de sua utilização e abstract-factory-c3adaeb5ac9a
vantagens, primariamente referentes a conexão de diferentes [12] Essentials, Part 1, Lesson 1: Compiling & Running a Simple
hierarquias de objetos e delegação do tipo de classe a se Program. (n.d.). Retrieved November 4, 2022, from
https://www.oracle.com/java/technologies/compile.html
instanciar às subclasses.
[13] Nykonenko, A. A. (2012). Creational design patterns in
Conclui-se, desta maneira, a obtenção de uma computational linguistics: Factory Method, Prototype, Singleton.
Cybernetics and Systems Analysis, 48(1), 138–145.
compreensão abrangente em relação ao Design Pattern https://doi.org/10.1007/s10559-012-9383-1
Factory Method. O estudo realizado demonstra que, por seu
[14] Fortuin, H. (2010). A Modern, Compact Implementation of the
carácter criacional e abrangência, este Pattern pode ser Parameterized Factory Design Pattern. The Journal of Object
aplicado em diferentes cenários e em diferentes sistemas, até Technology, 9(1), 57. https://doi.org/10.5381/jot.2010.9.1.c5
mesmo em alguns que não suportem diretamente orientação [15] Refactoring.Guru. (2022, January 1). Prototype.
a objetos, para onde foi projetado inicialmente. https://refactoring.guru/design-patterns/prototype
[16] (2022b, November 15). Factory Model Overview - ADO.NET.
Portanto, este estudo, em suma, caracteriza o que é o Microsoft Learn. https://learn.microsoft.com/en-
Factory Method, suas motivações, estruturação, relevância us/dotnet/framework/data/adonet/factory-model-overview
através de exemplos de uso na indústria, diferenciação, [17] DocumentBuilderFactory (Java 2 Platform SE 5.0). (n.d.-d).
conceitos e possíveis implementações. https://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/parsers/Docu
mentBuilderFactory.html
[18] Object (Java 2 Platform SE 5.0). (n.d.-b).
VII. AGRADECIMENTOS https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html
Gostaríamos de agradecer aos professores da cadeira de [19] Wikipedia contributors. (2022, November 21). Qt (software).
Arquitetura e Padrões de Software: ao Prof. Dr. Hugo Wikipedia. https://en.wikipedia.org/wiki/Qt_(software)
Paredes, da componente teórica, pela orientação e atribuição [20] Wikipedia contributors. (2022b, November 25). Factory method
do tema; e ao Prof. Dr. Luís Barbosa, pela exposição do pattern. Wikipedia.
Design Pattern. https://en.wikipedia.org/wiki/Factory_method_pattern
[21] The Qt Project. (n.d.). https://contribute.qt-project.org/doc/qt-
5.0/qtwidgets/qmainwindow.html