Go设计模式原型模式考查点及使用详解
什么是原型模式?
原型模式是一种创建型设计模式,其目的是通过克隆已有的对象来创建新的对象,而不是通过常规的new操作符通过调用构造函数来创建新的对象。原型模式的核心思想是通过使用原型实例来指定新对象的类型,然后通过复制这个原型来创建新的对象。
原型模式在Go语言中很常用,例如当我们需要创建一些相同属性和方法的对象,但是这些对象的具体实现细节可能是不同的。此时,我们可以使用原型模式,并基于原型实例进行复制和修改。
原型模式的考查点
在实际使用原型模式时,我们要考虑以下几个关键点:
- 原型类需要实现Clone()方法,用于复制自身;
- 克隆操作可以通过浅拷贝或深拷贝来实现;
- 原型模式适用于创建相同类型的多个对象,且这些对象的实现细节可能会有所不同;
- 当需要克隆复杂对象时,我们需要考虑如何正确地处理对象之间的关联关系。
使用原型模式的案例分析
浅拷贝
package main
import (
"fmt"
)
type Person struct {
Age int
Name string
Addresses []string
}
func (p *Person) Clone() *Person {
clone := *p
return &clone
}
func main() {
p1 := &Person{Age: 20, Name: "Tom", Addresses: []string{"Beijing", "Shanghai"}}
p2 := p1.Clone()
p2.Age = 21
p2.Addresses[0] = "Guangzhou"
fmt.Printf("p1 = %+v\np2 = %+v\n", p1, p2)
}
输出:
p1 = &{Age:20 Name:Tom Addresses:[Beijing Guangzhou]}
p2 = &{Age:21 Name:Tom Addresses:[Guangzhou Shanghai]}
上面的例子实现了一个Person结构体,并实现了Clone()方法来返回一个Person的克隆对象。在main()函数中,我们先创建一个Person对象p1,然后通过Clone()方法复制p1得到p2。最后,我们对p2的年龄和地址进行修改,并打印出两个对象的值。
其中,从输出结果可以看出,修改之后只有p2的年龄被修改,而地址则是共享的,即修改一个对象的属性会影响到所有克隆出来的对象。
深拷贝
package main
import (
"fmt"
)
type Address struct {
Province string
City string
}
type Person struct {
Age int
Name string
Addresses []*Address
}
func (p *Person) Clone() *Person {
clone := *p
clone.Addresses = make([]*Address, len(p.Addresses))
for i, addr := range p.Addresses {
clone.Addresses[i] = &Address{Province: addr.Province, City: addr.City}
}
return &clone
}
func main() {
p1 := &Person{
Age: 20,
Name: "Tom",
Addresses: []*Address{
&Address{Province: "Beijing", City: "Dongcheng"},
&Address{Province: "Shanghai", City: "Xuhui"},
},
}
p2 := p1.Clone()
p2.Name = "Jerry"
p2.Addresses[0].City = "Chaoyang"
fmt.Printf("p1 = %+v\np2 = %+v\n", p1, p2)
}
输出:
p1 = &{Age:20 Name:Tom Addresses:[0xc000052300 0xc000052320]}
p2 = &{Age:20 Name:Jerry Addresses:[0xc000052340 0xc000052360]}
上面的例子实现了一个包含Address地址列表的Person结构体,使用了深拷贝来复制对象并处理关联关系。
在main()函数中,我们先创建一个Person对象p1,其中包含两个Address对象。接着,我们通过Clone()方法创建p2,然后修改p2的Name和Addresses中第一个元素的City属性,并打印出两个对象的值。
从输出结果可以看出,修改后只有p2的Name和第一个Address的City被修改,而p1的值不变。
总结
原型模式是一种创建型设计模式,其核心思想是通过克隆已有的对象来创建新的对象,而不是通过常规的new操作符调用构造函数来创建新的对象。在实际使用原型模式时,我们需要考虑克隆操作的方式(浅拷贝/深拷贝)、如何处理对象之间的关联关系以及使用场景等因素。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go设计模式原型模式考查点及使用详解 - Python技术站