原型设计模式go实现尝试

文章目录


前言

本文章尝试使用go实现"原型"。


代码

go 复制代码
package main

import (
	"fmt"
)

// 不同原型标志枚举
type Type int

const (
	PROTOTYPE_1 Type = iota
	PROTOTYPE_2
)

// 原型接口
type IPrototype interface {
	Clone() IPrototype
	Method(value int)
	Print()
}

// 具体原型1
type ConcretePrototype1 struct {
	name  string
	value int
}

// 构造函数
func NewConcretePrototype1ByFields(name string, value int) *ConcretePrototype1 {
	return &ConcretePrototype1{
		name,
		value,
	}
}

func NewConcretePrototype1ByObject(cp *ConcretePrototype1) *ConcretePrototype1 {
	return &ConcretePrototype1{
		name:  cp.name,
		value: cp.value,
	}
}

// 接口方法
func (cp *ConcretePrototype1) Clone() IPrototype {
	return NewConcretePrototype1ByObject(cp)
}

func (cp *ConcretePrototype1) Method(value int) {
	cp.value = value
}

func (cp *ConcretePrototype1) Print() {
	fmt.Println("Call Method1 from ", cp.name, " with field : ", cp.value)
}

// 具体原型2
type ConcretePrototype2 struct {
	name  string
	value int
}

// 构造函数
func NewConcretePrototype2ByFields(name string, value int) *ConcretePrototype2 {
	return &ConcretePrototype2{
		name,
		value,
	}
}

func NewConcretePrototype2ByObject(cp *ConcretePrototype2) *ConcretePrototype2 {
	return &ConcretePrototype2{
		name:  cp.name,
		value: cp.value,
	}
}

// 接口方法
func (cp *ConcretePrototype2) Clone() IPrototype {
	return NewConcretePrototype2ByObject(cp)
}

func (cp *ConcretePrototype2) Method(value int) {
	cp.value = value
}

func (cp *ConcretePrototype2) Print() {
	fmt.Println("Call Method2 from ", cp.name, " with field : ", cp.value)
}

// 原型工厂
type PrototypeFactory struct {
	prototypes map[Type]IPrototype
}

func NewPrototypeFactory() *PrototypeFactory {
	return &PrototypeFactory{
		prototypes: map[Type]IPrototype{
			PROTOTYPE_1: NewConcretePrototype1ByFields("PROTOTYPE_1 ", 1),
			PROTOTYPE_2: NewConcretePrototype2ByFields("PROTOTYPE_2 ", 2),
		},
	}
}

func (p *PrototypeFactory) CreatePrototype(t Type) IPrototype {
	return p.prototypes[t].Clone()
}

// 客户端代码
func clientCode(p *PrototypeFactory) {
	fmt.Println("Let's create a Prototype 1")

	prototype1 := p.CreatePrototype(PROTOTYPE_1)
	prototype2 := p.CreatePrototype(PROTOTYPE_1)
	prototype1.Method(3)
	prototype2.Method(4)
	prototype1.Print()
	prototype2.Print()

	fmt.Println()

	fmt.Println("Let's create a Prototype 2")

	prototype1 = p.CreatePrototype(PROTOTYPE_2)
	prototype2 = p.CreatePrototype(PROTOTYPE_2)
	prototype1.Method(5)
	prototype2.Method(6)
	prototype1.Print()
	prototype2.Print()
}

func main() {
	clientCode(NewPrototypeFactory())
}

结果

复制代码
Let's create a Prototype 1
Call Method1 from  PROTOTYPE_1   with field :  3
Call Method1 from  PROTOTYPE_1   with field :  4

Let's create a Prototype 2
Call Method2 from  PROTOTYPE_2   with field :  5
Call Method2 from  PROTOTYPE_2   with field :  6

总结

新人设计模式理解,望大家多多指点。

相关推荐
zfj3214 小时前
vscode是js开发的,为什么能支持golang java等各种语言开发
javascript·vscode·golang
serendipity_hky5 小时前
【go语言 | 第5篇】channel——多个goroutine之间通信
开发语言·后端·golang
源代码•宸5 小时前
分布式缓存-GO(简历写法、常见面试题)
服务器·开发语言·经验分享·分布式·后端·缓存·golang
__万波__7 小时前
二十三种设计模式(十三)--模板方法模式
java·设计模式·模板方法模式
锥锋骚年8 小时前
golang 发送内网邮件和外网邮件
开发语言·后端·golang
古城小栈8 小时前
工业互联网:Go + 边缘计算实现设备监控实战
人工智能·golang·边缘计算
令狐囱9 小时前
宝塔docker 运行 go-zero-looklook项目
docker·容器·golang
moxiaoran57539 小时前
Go 语言指针
开发语言·golang
serendipity_hky9 小时前
【go语言 | 第4篇】goroutine模型和调度策略
后端·性能优化·golang