Прототип (Prototype)
Паттерн Prototype относится к порождающим паттернам уровня объекта.
Паттерн Prototype позволяет создавать новые объекты, путем копирования (клонирования) созданного ранее объекта-оригинала-продукта (прототипа).
Паттерн описывает процесс создания объектов-клонов на основе имеющегося объекта-прототипа, другими словами, паттерн Prototype описывает способ организации процесса клонирования.
Требуется для реализации:
- Базовый класс Prototype, объявляющий интерфейс клонирования. Все классы его наследующие должны реализовывать этот механизм клонирования;
- Класс продукта ConcretePrototypeA, который должен реализовывать этот прототип;
- Класс продукта ConcretePrototypeB, который должен реализовывать этот прототип.
Обычно операция клонирования происходит через метод clone(), который описан в базовом классе и его должен реализовать каждый продукт.
[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Значение этого Типа и Интерфейс. Также в языке Go за место общепринятого наследования используется агрегирование и встраивание.
//prototype.go
// Package prototype is an example of the Singleton Pattern.
package prototype
// Prototyper provides a cloning interface.
type Prototyper interface {
Clone() Prototyper
GetName() string
}
// ConcreteProduct implements product "A"
type ConcreteProduct struct {
name string // Имя продукта
}
// NewConcreteProduct is the Prototyper constructor.
func NewConcreteProduct(name string) Prototyper {
return &ConcreteProduct{
name: name,
}
}
// GetName returns product name
func (p *ConcreteProduct) GetName() string {
return p.name
}
// Clone returns a cloned object.
func (p *ConcreteProduct) Clone() Prototyper {
return &ConcreteProduct{p.name}
}
//prototype_test.go
package prototype
import (
"testing"
)
func TestPrototype(t *testing.T) {
product := NewConcreteProduct("A")
cloneProduct := product.Clone()
if cloneProduct.GetName() != product.GetName() {
t.Error("Expect name \"A\" to equal, but not equal.")
}
}