网站开发 常德,搜狗提交网站入口,杭州网站建设提供商,企业内网搭建要多少钱文章目录 前言代码结果总结 前言
本文章尝试使用go实现“原型”。 代码
package mainimport (fmt
)// 不同原型标志枚举
type Type intconst (PROTOTYPE_1 Type iotaPROTOTYPE_2
)// 原型接口
type IPrototype interface {Clone() IPrototypeMethod(value int)P… 文章目录 前言代码结果总结 前言
本文章尝试使用go实现“原型”。 代码
package mainimport (fmt
)// 不同原型标志枚举
type Type intconst (PROTOTYPE_1 Type iotaPROTOTYPE_2
)// 原型接口
type IPrototype interface {Clone() IPrototypeMethod(value int)Print()
}// 具体原型1
type ConcretePrototype1 struct {name stringvalue 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 stringvalue 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(Lets 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(Lets 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())
}结果
Lets create a Prototype 1
Call Method1 from PROTOTYPE_1 with field : 3
Call Method1 from PROTOTYPE_1 with field : 4Lets create a Prototype 2
Call Method2 from PROTOTYPE_2 with field : 5
Call Method2 from PROTOTYPE_2 with field : 6总结
新人设计模式理解望大家多多指点。