Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 5dc8ad1

Browse files
committedMar 23, 2016
add prototype
1 parent 450e19a commit 5dc8ad1

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed
 

‎07_prototype/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# 原型模式
2+
3+
原型模式使对象能复制自身,并且暴露到接口中,使客户端面向接口编程时,不知道接口实际对象的情况下生成新的对象。
4+
5+
原型模式配合原型管理器使用,使得客户端在不知道具体类的情况下,通过接口管理器得到新的实例,并且包含部分预设定配置。

‎07_prototype/prototype.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package prototype
2+
3+
//Cloneable 是原型对象需要实现的接口
4+
type Cloneable interface {
5+
Clone() Cloneable
6+
}
7+
8+
type PrototypeManager struct {
9+
prototypes map[string]Cloneable
10+
}
11+
12+
func NewPrototypeManager() *PrototypeManager {
13+
return &PrototypeManager{
14+
prototypes: make(map[string]Cloneable),
15+
}
16+
}
17+
18+
func (p *PrototypeManager) Get(name string) Cloneable {
19+
return p.prototypes[name]
20+
}
21+
22+
func (p *PrototypeManager) Set(name string, prototype Cloneable) {
23+
p.prototypes[name] = prototype
24+
}

‎07_prototype/prototype_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package prototype
2+
3+
import "testing"
4+
5+
var manager *PrototypeManager
6+
7+
type Type1 struct {
8+
name string
9+
}
10+
11+
func (t *Type1) Clone() Cloneable {
12+
tc := *t
13+
return &tc
14+
}
15+
16+
type Type2 struct {
17+
name string
18+
}
19+
20+
func (t *Type2) Clone() Cloneable {
21+
tc := *t
22+
return &tc
23+
}
24+
25+
func TestClone(t *testing.T) {
26+
t1 := manager.Get("t1")
27+
28+
t2 := t1.Clone()
29+
30+
if t1 == t2 {
31+
t.Fatal("error! get clone not working")
32+
}
33+
}
34+
35+
func TestCloneFromManager(t *testing.T) {
36+
c := manager.Get("t1").Clone()
37+
38+
t1 := c.(*Type1)
39+
if t1.name != "type1" {
40+
t.Fatal("error")
41+
}
42+
43+
}
44+
45+
func init() {
46+
manager = NewPrototypeManager()
47+
48+
t1 := &Type1{
49+
name: "type1",
50+
}
51+
manager.Set("t1", t1)
52+
}

0 commit comments

Comments
 (0)
Failed to load comments.