O padrão Prototype é um padrão criacional, este tem como principal objetivo permitir que objetos sejam copiados sem que seus códigos fiquem dependentes de suas classes.
Este padrão de projeto determina que o próprio objeto é responsável pelo clonagem, facilitando assim o processo, uma vez que as classes podem possuir conteúdo que não pode ser copiado "de fora".
Exemplo do código em Python
class SelfReferencingEntity:
def __init__(self):
self.parent = None
def set_parent(self, parent):
self.parent = parent
class SomeComponent:
def __init__(self, some_int, some_list_of_objects, some_circular_ref):
self.some_int = some_int
self.some_list_of_objects = some_list_of_objects
self.some_circular_ref = some_circular_ref
def __copy__(self):
# First, let's create copies of the nested objects.
some_list_of_objects = copy.copy(self.some_list_of_objects)
some_circular_ref = copy.copy(self.some_circular_ref)
# Then, let's clone the object itself, using the prepared clones of the
# nested objects.
new = self.__class__(
self.some_int, some_list_of_objects, some_circular_ref
)
new.__dict__.update(self.__dict__)
return new
def __deepcopy__(self, memo={}):
# First, let's create copies of the nested objects.
some_list_of_objects = copy.deepcopy(self.some_list_of_objects, memo)
some_circular_ref = copy.deepcopy(self.some_circular_ref, memo)
# Then, let's clone the object itself, using the prepared clones of the
# nested objects.
new = self.__class__(
self.some_int, some_list_of_objects, some_circular_ref
)
new.__dict__ = copy.deepcopy(self.__dict__, memo)
return new
Python oferece uma interface própria de Prototype através das funções "copy.copy" e "copy.deepcopy". A classe que desejar personalizar estas cópias deve sobrescrever as funções "copy" e "deepcopy".
A função "copy.copy" é considera uma "cópia rasa" e cria um novo objeto preenchendo-o com referências para seus respectivos itens no objeto original. Já a "copy.deepcopy" cria a cópia e a preenche utilizando recursividade.
Referências
Padrões de Projeto (Diogo Moreira, 2020)
Mergulho nos Padrões de Projeto - v2020-1.14 (Alexander Shvets, 2020)
copy in Python
Os códigos usados como exemplo foram retirados do livro Mergulho nos Padrões de Projeto.
Top comments (0)