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原型模式的主要内容,如果未能解决你的问题,请参考以下文章

[设计模式C++go]创建型模式:原型模式

[设计模式C++go]创建型模式:原型模式

[设计模式C++go]创建型模式:原型模式

Go设计模式—原型模式

架构师内功心法,只是单纯听说过的原型模式详解

架构师内功心法,只是单纯听说过的原型模式详解