GO设计模式02原型模式
Posted XY丶YX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GO设计模式02原型模式相关的知识,希望对你有一定的参考价值。
(注:本文为http://c.biancheng.net/view/1317.html学习笔记)
一、概述
原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。
package main
import (
"fmt"
)
func main() {
fmt.Println("hello")
SimpleExec()
//ComplexExec()
//QianExec()
//ShenExec()
}
二、简单例子
package main
import (
"fmt"
)
type info struct{
name string
sex string
}
type work struct{
time string
place string
}
type Person struct{
info
work
}
func (this *Person) SetInfo(name, sex string){
this.name = name
this.sex = sex
}
func (this *Person) SetWork(time, place string){
this.time = time
this.place = place
}
func (this *Person) Clone() *Person{
//深克隆
//person := *this
//return &person
//浅克隆
return this
}
func SimpleExec() {
person1 := Person{}
person1.SetInfo("testMan", "man")
person1.SetWork("oneyear", "wps")
person2 := person1.Clone()
fmt.Println(&person1)
fmt.Println(person2)
person2.SetWork("twoyear", "kingsoft")
fmt.Println()
fmt.Println(&person1)
fmt.Println(person2)
fmt.Printf("%p \\n", &person1)
fmt.Printf("%p \\n", person2)
}
三、复杂例子
package main
import(
"fmt"
)
//ShapeClone 有克隆方法的接口
type ShapeClone interface {
Clone() ShapeClone
}
//ShapeManager 模型管理类,用于保存所有Clone接口的原型
type ShapeManager struct {
ShapeList map[string]ShapeClone
}
//NewShapeManager 新建模型管理类
func NewShapeManager() *ShapeManager {
return &ShapeManager{
ShapeList: make(map[string]ShapeClone),
}
}
//Set 添加原型
func (s *ShapeManager) Set(name string, proto ShapeClone) {
s.ShapeList[name] = proto
}
//Get 获取原型
func (s *ShapeManager) Get(name string) ShapeClone {
return s.ShapeList[name]
}
//Circle 圆形类,实现shapeclone接口
type Circle struct {
Name string
}
//GetName 获取circle的名字
func (c *Circle) GetName() string {
return c.Name
}
//Draw circle的方法
func (c *Circle) Draw() {
fmt.Println("Circle Draw().")
}
//Clone 返回circle类的复制
func (c *Circle) Clone() ShapeClone {
//深克隆
circleClone := *c
return &circleClone
//浅克隆
//return c
}
//NewCircle 新建一个CIrcle类
func NewCircle(name string) *Circle {
return &Circle{Name: name}
}
func ComplexExec(){
circle := NewCircle("一个圆")
circle.Draw()
fmt.Println(circle.GetName())
protoTypeManager := NewShapeManager()
protoTypeManager.Set("circle", circle)
circle1 := protoTypeManager.Get("circle")
circle2 := circle1.Clone()
fmt.Printf("%T, %p, \\n", circle, circle)
fmt.Printf("%T, %p, \\n", circle, circle1)
fmt.Printf("%T, %p, \\n", circle, circle2)
//circle2 := circle.Clone()
//circle2.Draw()
//fmt.Println(circle2.GetName())
}
四、浅克隆实验
package main
import (
"fmt"
)
type Prototype interface {
Clone() Prototype
}
type Persional struct {
Age int
Hobbies map[int]string
}
func NewPersional(age int, hobbies map[int]string) *Persional{
return &Persional{
Age: age,
Hobbies: hobbies,
}
}
// 浅拷贝
func (p *Persional)Clone() *Persional{
return p
}
func QianExec(){
hobbies := map[int]string{
1: "football",
2: "basketball",
}
//li := NewPersional(20, hobbies)
li := Persional{20, hobbies}
fmt.Printf("li's information:%+v\\n",li)
wang := li.Clone()
fmt.Printf("wang's information:%+v\\n", wang)
wang.Hobbies[1] = "ball"
fmt.Printf("li's information:%+v\\n",li)
fmt.Printf("wang's information:%+v\\n", wang)
fmt.Printf("%p \\n", &li)
fmt.Printf("%p \\n", wang)
}
五、深克隆实验
package main
import (
"fmt"
)
type Prototype2 interface {
Clone() Prototype2
}
type Persion struct {
Age int
Hobbies map[int]string
}
func NewPersion(age int, hobbies map[int]string) *Persion{
return &Persion{
Age: age,
Hobbies: hobbies,
}
}
// 深拷贝
func (p *Persion)Clone() *Persion{
hobbies := make(map[int]string)
for key, hobby := range p.Hobbies {
hobbies[key] = hobby
}
return &Persion{
Age: p.Age,
Hobbies: hobbies,
}
}
func ShenExec(){
hobbies := map[int]string{
1: "football",
2: "basketball",
}
li := NewPersion(20, hobbies)
fmt.Printf("li's information:%+v\\n",li)
wang := li.Clone()
fmt.Printf("wang's information:%+v\\n", wang)
wang.Hobbies[1] = "ball"
fmt.Printf("li's information:%+v\\n",li)
fmt.Printf("wang's information:%+v\\n", wang)
fmt.Printf("%p \\n", &li)
fmt.Printf("%p \\n", wang)
}
以上是关于GO设计模式02原型模式的主要内容,如果未能解决你的问题,请参考以下文章