Factory Method is a Creational Design Pattern that allows an interface or a class to create an object, but let subclasses decides which class or object to instantiate. Usando o método de fábrica, temos as melhores maneiras de criar um objeto. Aqui, os objetos são criados sem expor a lógica ao cliente e para criar o novo tipo do objeto, o cliente usa a mesma interface comum.
problemas que enfrentamos sem Método de fábrica:
Imagine que está a ter a sua própria startup, que oferece uma partilha livre nas diferentes partes do país. A versão inicial do app apenas fornece o ridesharing de duas rodas, mas com o passar do tempo, o seu app torna-se popular e agora você quer adicionar três e Quatro Rodas ridesharing também.É uma grande notícia! mas e os desenvolvedores de software de sua startup? Eles têm que alterar todo o código porque agora a maior parte do código é acoplado com a classe de Duas Rodas e os desenvolvedores têm que fazer alterações em toda a base de código.
depois de todas essas mudanças, ou os desenvolvedores terminam com o código confuso ou com a carta de demissão.
Localizador app
representação Gráfica de Problemas sem o uso de Método de Fábrica
Vamos entender o conceito com um exemplo a mais que está relacionado com as localizações e traduções de línguas diferentes.Suponha que criamos um aplicativo cujo objetivo principal é traduzir uma língua para outra e atualmente o nosso aplicativo trabalha apenas com 10 idiomas. Agora o nosso aplicativo tornou-se amplamente popular entre as pessoas, mas a demanda cresceu de repente para incluir mais 5 línguas.É uma grande notícia! apenas para o proprietário não para os desenvolvedores. Eles têm que alterar todo o código porque agora a maior parte do código é acoplado apenas com as línguas existentes e é por isso que os desenvolvedores têm que fazer alterações em toda a base de código, o que é realmente uma tarefa difícil de fazer.
vamos olhar para o código para o problema que podemos enfrentar sem usar o método de fábrica.
Nota: O código seguinte é escrito sem usar o método de fábrica.
class
FrenchLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"voiture"
,
"bike"
:
"bicyclette"
,
"cycle"
:
"cyclette"
}
def
localize(
self
, message):
return
self
.translations.get(msg, msg)
class
SpanishLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"coche"
,
"bike"
:
"bicicleta"
,
"cycle"
:
"ciclo"
}
def
localize(
self
, msg):
return
self
.translations.get(msg, msg)
class
EnglishLocalizer:
def
localize(
self
, msg):
return
msg
if
__name__
=
=
"__main__"
:
f
=
FrenchLocalizer()
e
=
EnglishLocalizer()
s
=
SpanishLocalizer()
message
=
for
msg
in
message:
print
(f.localize(msg))
print
(e.localize(msg))
print
(s.localize(msg))
solução Por Método de fábrica:
sua solução é substituir as chamadas de construção de objeto direto para a frente com chamadas para o método de fábrica especial. Na verdade, não haverá diferença na criação de objetos, mas eles estão sendo chamados dentro do método de fábrica.
por exemplo: as nossas classes Two_Wheeler, Three_Wheeler e Four_wheeler devem implementar a interface de partilha de pacotes que irá declarar um método chamado ride. Cada classe irá implementar este método de forma única.
solution_factory_diagram
now let us understand the factory method with the help of an example:
class
FrenchLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"voiture"
,
"bike"
:
"bicyclette"
,
"cycle"
:
"cyclette"
}
def
localize(
self
, message):
return
self
.translations.get(msg, msg)
class
SpanishLocalizer:
def
__init__(
self
):
self
.translations
=
{
"car"
:
"coche"
,
"bike"
:
"bicicleta"
,
"cycle"
:
"ciclo"
}
def
localize(
self
, msg):
return
self
.translations.get(msg, msg)
class
EnglishLocalizer:
def
localize(
self
, msg):
return
msg
def
Factory(language
=
"English"
):
localizers
=
{
"French"
: FrenchLocalizer,
"English"
: EnglishLocalizer,
"Spanish"
: SpanishLocalizer,
}
return
localizers()
if
__name__
=
=
"__main__"
:
f
=
Factory(
"French"
)
e
=
Factory(
"English"
)
s
=
Factory(
"Spanish"
)
message
=
for
msg
in
message:
print
(f.localize(msg))
print
(e.localize(msg))
print
(s.localize(msg))
Diagrama de Classe para o Método de Fábrica:
vejamos o diagrama de classes considerando o exemplo de partilha de viagens.
Factory_pattern_class_diagrma
vantagens do método-Fábrica:
- podemos facilmente adicionar os novos tipos de produtos sem perturbar o código de cliente existente.Geralmente, o acoplamento apertado é evitado entre os produtos e as classes e objetos criadores.
desvantagens da utilização do método de fábrica:
- para criar um objeto de produto concreto particluar, o cliente pode ter que subclassificar a classe criadora.
- você acaba com um grande número de pequenos arquivos I. E., A confusão dos arquivos.
- em um sistema gráfico, dependendo da entrada do usuário, ele pode desenhar diferentes formas como Retângulo, Quadrado, círculo, etc. Mas para a facilidade de ambos os desenvolvedores, bem como o cliente, podemos usar o método de fábrica para criar a instância, dependendo da entrada do Usuário. Então não temos que mudar o código do cliente para adicionar uma nova forma.
- num local de reserva de Hotel, podemos reservar um espaço para 1 Quarto, 2 quartos, 3 quartos, etc. Aqui o usuário pode inserir o número de quartos que deseja reservar. Usando o método de fábrica, podemos criar uma classe de fábrica qualquer sala que nos ajudará a criar a instância, dependendo da entrada do Usuário. Mais uma vez, não temos de alterar o código do cliente para adicionar as novas instalações.
aplicabilidade :
leia mais: padrão de fábrica em C++