前言
本文章尝试使用go实现“原型”。文章来源:https://www.toymoban.com/news/detail-613893.html
代码
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
总结
新人设计模式理解,望大家多多指点。文章来源地址https://www.toymoban.com/news/detail-613893.html
到了这里,关于原型设计模式go实现尝试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!