Golang y patrón de diseño: patrón de prototipo de prototipo

El modo de prototipo Prototype es en realidad un modo de diseño creacional que genera nuevas instancias basadas en el prototipo de la instancia. Le permite copiar objetos, incluso objetos complejos, sin que su código dependa de la clase a la que pertenecen.

Una aplicación típica es la inyección de dependencia, que debería ser familiar para aquellos que han hecho desarrollo en .Net y Java. go también tiene un marco de inyección de dependencia

Escenas

La escena en este número es muy simple, hemos implementado un modelo simple de inyección de dependencia.

Tipos básicos e interfaces

Esta es la interfaz prototipo, y las instancias que necesitan implementar la inyección de dependencia deben implementar esta interfaz

// 产品接口(原型接口)
type Product interface {
	// 用于演示的方法
	Use()
	// 克隆方法,返回自身的副本(不是指针)
	Clone() Product
}

Gestión de grupos de prototipos

Hay un Mapa dentro del Administrador, y las instancias registradas se almacenan en el Mapa, y se proporcionan los métodos para registrar Register() y obtener la instancia del prototipo Clone()

// 产品管理
type Manager struct {
	// 原型池
	products map[string]Product
}

// 注册原型到原型池
func (m *Manager) Register(name string, product Product) {
	_, ok := m.products[name]
	if ok {
		return
	}

	m.products[name] = product
}

// Clone一个对象,返回其副本
func (m *Manager) Clone(name string) Product {
	v, ok := m.products[name]
	if !ok {
		return nil
	}

	// 调用被克隆对象自身的克隆方法
	return v.Clone()
}

lograr

Define un tipo de iPhone que implementa la interfaz prototipo

// 演示产品,实现了原型接口
type IPhone struct {
	Name string
}

// 演示方法
func (p *IPhone) Use() {
	fmt.Printf("正在使用 %s 打电话\n", p.Name)
}

// 克隆的细节
func (p *IPhone) Clone() Product {
	return &IPhone{Name: p.Name + "_clone"}
}

prueba

Aquí juzgo que lo que devuelve Clone() no es el prototipo en sí al generar el puntero del objeto

func main() {
	iphone7 := IPhone{Name: "IPhone7"}
	iphone7.Use()
	fmt.Printf("%s 的指针式 %p \n\n", iphone7.Name, &iphone7)

	manager := Manager{products: make(map[string]Product)}
	manager.Register("iphone7", &iphone7)

	clone_iphone7 := manager.Clone("iphone7")
	clone_iphone7.Use()
	fmt.Printf("clone_iphone7 的指针式 %p \n", &clone_iphone7)
}

resultado de la operación

El resultado es el esperado

 El código se cargó en Github: LyonNee/design_patterns_with_go: código de patrón de diseño basado en Golang (github.com) 

Supongo que te gusta

Origin blog.csdn.net/Lyon_Nee/article/details/119619306
Recomendado
Clasificación