1. O que é o Padrão de Protótipo
No desenvolvimento de software, o padrão de protótipo é um padrão de design de criação que permite criar novos objetos copiando objetos existentes sem usar o operador new. Este método faz uso do relacionamento de clonagem entre objetos para separar a criação e o uso de objetos.
2. Características e vantagens do padrão de protótipo
- Características:
- Permite a criação dinâmica de objetos em tempo de execução.
- Reduz o tempo de criação de objetos e melhora o desempenho do sistema.
- Separa a criação e o uso de objetos, facilitando a gerência e a extensão.
- Vantagens:
- Melhora a eficiência da criação de objetos.
- Simplifica o processo de criação de objetos.
- Pode aumentar ou diminuir dinamicamente objetos.
3. Cenários de aplicação do padrão de protótipo em Golang
O padrão de protótipo é adequado para os seguintes cenários:
- Quando a criação de objetos é complexa, mas é mais eficiente criar objetos copiando objetos existentes.
- Quando há necessidade de criar ou clonar objetos dinamicamente, em vez de criar novas instâncias de objeto diretamente.
4. Implementação do padrão de protótipo em Golang
4.1. Diagrama de classe UML
4.2. Etapa de Implementação 1: Criar uma Interface de Protótipo
Primeiro, crie uma interface de protótipo que defina o método clone.
type Prototipo interface {
clone() Prototipo
}
4.3. Etapa de Implementação 2: Criar e Clonar Objetos Usando a Interface de Protótipo
4.3.1. Criar uma Classe Gerenciadora de Protótipos
A classe gerenciadora de protótipos é responsável por criar e gerenciar objetos de protótipo.
type GerenciadorDePrototipos struct {
prototipos map[string]Prototipo
}
func NovoGerenciadorDePrototipos() *GerenciadorDePrototipos {
return &GerenciadorDePrototipos{
prototipos: make(map[string]Prototipo),
}
}
func (gp *GerenciadorDePrototipos) Registrar(nome string, prototipo Prototipo) {
gp.prototipos[nome] = prototipo
}
func (gp *GerenciadorDePrototipos) Desregistrar(nome string) {
delete(gp.prototipos, nome)
}
func (gp *GerenciadorDePrototipos) Clonar(nome string) Prototipo {
prototipo, ok := gp.prototipos[nome]
if ok {
return prototipo.clone()
}
return nil
}
4.3.2. Criar e Clonar Objetos Usando a Classe Gerenciadora de Protótipos
type Produto struct {
nome string
}
func (p *Produto) clone() Prototipo {
return &Produto{
nome: p.nome,
}
}
func main() {
gerenciador := NovoGerenciadorDePrototipos()
// Registrar objetos de protótipo na classe gerenciadora de protótipos
gerenciador.Registrar("produtoA", &Produto{nome: "Produto A"})
// Criar e clonar objetos usando a classe gerenciadora de protótipos
produtoA := gerenciador.Clonar("produtoA").(*Produto)
fmt.Println(produtoA.nome) // Saída: Produto A
}
4.4. Etapa de Implementação 3: Considerações e Melhores Práticas para Usar o Padrão de Protótipo
Ao usar o padrão de protótipo, deve-se observar os seguintes pontos:
- O padrão de protótipo é adequado para uso quando o custo de criação de objeto é alto, pois a clonagem de objetos pode economizar tempo de criação.
- Preste atenção à implementação do método clone do objeto para garantir que o objeto clonado seja consistente com o original.