From 1b7e2c91c5c2884405d1c0528ed9b8f2d189a9fd Mon Sep 17 00:00:00 2001 From: Edward Date: Wed, 22 Apr 2020 09:50:47 +0800 Subject: [PATCH 1/8] add functional_options --- README.md | 57 +++++++++++----------- idiom/functional_options_test.go | 83 ++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 28 deletions(-) create mode 100644 idiom/functional_options_test.go diff --git a/README.md b/README.md index 7703832..12bb8e1 100644 --- a/README.md +++ b/README.md @@ -4,47 +4,48 @@ [![Build Status](https://travis-ci.org/senghoo/golang-design-pattern.svg?branch=master)](https://travis-ci.org/senghoo/golang-design-pattern) - ## 姿势 -以实际代码示例展示设计模式 - ++ 所谓模式就是套路,如功夫,招有定式 ++ 这里就是以实际代码示例展示设计模式,通俗易懂 ++ 除了常见的23种普适的设计模式,Go也有一些属于自己的模式 ## 创建型模式 -* [简单工厂模式(Simple Factory)](./creation/00_simple_factory) -* [工厂方法模式(Factory Method)](./creation/04_factory_method) -* [抽象工厂模式(Abstract Factory)](./creation/05_abstract_factory) -* [创建者模式(Builder)](./creation/06_builder) -* [原型模式(Prototype)](./creation/07_prototype) -* [单例模式(Singleton)](./creation/03_singleton) ++ [简单工厂模式(Simple Factory)](./creation/00_simple_factory) ++ [工厂方法模式(Factory Method)](./creation/04_factory_method) ++ [抽象工厂模式(Abstract Factory)](./creation/05_abstract_factory) ++ [创建者模式(Builder)](./creation/06_builder) ++ [原型模式(Prototype)](./creation/07_prototype) ++ [单例模式(Singleton)](./creation/03_singleton) ## 结构型模式 -* [外观模式(Facade)](./01_facade) -* [适配器模式(Adapter)](./02_adapter) -* [代理模式(Proxy)](./09_proxy) -* [组合模式(Composite)](./13_composite) -* [享元模式(Flyweight)](./18_flyweight) -* [装饰模式(Decorator)](./20_decorator) -* [桥模式(Bridge)](./22_bridge) ++ [外观模式(Facade)](./01_facade) ++ [适配器模式(Adapter)](./02_adapter) ++ [代理模式(Proxy)](./09_proxy) ++ [组合模式(Composite)](./13_composite) ++ [享元模式(Flyweight)](./18_flyweight) ++ [装饰模式(Decorator)](./20_decorator) ++ [桥模式(Bridge)](./22_bridge) ## 行为型模式 -* [中介者模式(Mediator)](./08_mediator) -* [观察者模式(Observer)](./10_observer) -* [命令模式(Command)](./11_command) -* [迭代器模式(Iterator)](./12_iterator) -* [模板方法模式(Template Method)](./14_template_method) -* [策略模式(Strategy)](./15_strategy) -* [状态模式(State)](./16_state) -* [备忘录模式(Memento)](./17_memento) -* [解释器模式(Interpreter)](./19_interpreter) -* [职责链模式(Chain of Responsibility)](./21_chain_of_responsibility) -* [访问者模式(Visitor)](./23_visitor) ++ [中介者模式(Mediator)](./08_mediator) ++ [观察者模式(Observer)](./10_observer) ++ [命令模式(Command)](./11_command) ++ [迭代器模式(Iterator)](./12_iterator) ++ [模板方法模式(Template Method)](./14_template_method) ++ [策略模式(Strategy)](./15_strategy) ++ [状态模式(State)](./16_state) ++ [备忘录模式(Memento)](./17_memento) ++ [解释器模式(Interpreter)](./19_interpreter) ++ [职责链模式(Chain of Responsibility)](./21_chain_of_responsibility) ++ [访问者模式(Visitor)](./23_visitor) ## Design patters Articles [GO模式](https://github.com/tmrts/go-patterns) -[本设计模式的原始代码](https://github.com/senghoo/golang-design-pattern) +[参考代码1](https://github.com/tmrts/go-patterns) +[参考代码2](https://github.com/senghoo/golang-design-pattern) diff --git a/idiom/functional_options_test.go b/idiom/functional_options_test.go new file mode 100644 index 0000000..5141b55 --- /dev/null +++ b/idiom/functional_options_test.go @@ -0,0 +1,83 @@ +package idiom + +import ( + "os" + "testing" +) + +func TestFileFunctionOptions(t *testing.T) { + err := New("empty.txt") + if err != nil { + panic(err) + } + os.Remove("empty.txt") + + err = New("file.txt", UID(1000), Contents("input some data")) + if err != nil { + panic(err) + } + os.Remove("file.txt") +} + +///Options is key struct +type Options struct { + UID int + GID int + Flags int + Contents string + Permissions os.FileMode +} + +//Option func is key func +type Option func(*Options) + +func UID(userID int) Option { + return func(args *Options) { + args.UID = userID + } +} + +func GID(groupID int) Option { + return func(args *Options) { + args.GID = groupID + } +} + +func Contents(c string) Option { + return func(args *Options) { + args.Contents = c + } +} + +func Permissions(perms os.FileMode) Option { + return func(args *Options) { + args.Permissions = perms + } +} + +func New(filepath string, setters ...Option) error { + // Default Options + args := &Options{ + UID: os.Getuid(), + GID: os.Getgid(), + Contents: "", + Permissions: 0666, + Flags: os.O_CREATE | os.O_EXCL | os.O_WRONLY, + } + + for _, setter := range setters { + setter(args) + } + + f, err := os.OpenFile(filepath, args.Flags, args.Permissions) + if err != nil { + return err + } + defer f.Close() + + if _, err := f.WriteString(args.Contents); err != nil { + return err + } + + return err +} From 8105b1977dedef5a5c63837cd5e069cc0f95ca92 Mon Sep 17 00:00:00 2001 From: Edward Date: Thu, 23 Apr 2020 09:26:32 +0800 Subject: [PATCH 2/8] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 12bb8e1..86e4ff9 100644 --- a/README.md +++ b/README.md @@ -49,3 +49,9 @@ [参考代码1](https://github.com/tmrts/go-patterns) [参考代码2](https://github.com/senghoo/golang-design-pattern) + +## 更多 + +需要重新温习下Go基础?看这里 + +[go-exercise](https://github.com/crazybber/go-exercise) From 7af536b2225692a603a97124b2279baea0b4babd Mon Sep 17 00:00:00 2001 From: Edward Date: Thu, 23 Apr 2020 09:47:58 +0800 Subject: [PATCH 3/8] finish Singleton pattern --- creation/03_singleton/README.md | 8 +++- creation/03_singleton/singleton.go | 47 ++++++++++++++++++---- creation/03_singleton/singleton_test.go | 52 +++++++++++++++++++------ 3 files changed, 87 insertions(+), 20 deletions(-) diff --git a/creation/03_singleton/README.md b/creation/03_singleton/README.md index 8bf5720..6b6ac50 100644 --- a/creation/03_singleton/README.md +++ b/creation/03_singleton/README.md @@ -1,3 +1,9 @@ # 单例模式 -使用懒惰模式的单例模式,使用双重检查加锁保证线程安全 +大名鼎鼎的单例模式,永远返回相同内存位置的绝对的、同一个实例对象。 + +Go有两种常见的单例模式: + ++ 使用懒惰模式的单例模式,使用`once.Do()`的双重同步检查保证线程安全生成单实例 + ++ 使用初始化的`init(){}`能力保证只生成一个实例 diff --git a/creation/03_singleton/singleton.go b/creation/03_singleton/singleton.go index c99a380..bd644f1 100644 --- a/creation/03_singleton/singleton.go +++ b/creation/03_singleton/singleton.go @@ -2,17 +2,50 @@ package singleton import "sync" -//Singleton 是单例模式类 -type Singleton struct{} +//////////////////////////////// +//way 1 +//使用 sync的 once.Do(){}确保执行一次 +//////////////////////////////// -var singleton *Singleton +//Worker Singleton 是单例模式类 +type Worker struct{} + +//better to be pointer +var onlyTheWorker *Worker + +// init a control var once sync.Once -//GetInstance 用于获取单例模式对象 -func GetInstance() *Singleton { +//GetWorkerInstance 总是获取到同一个Worker对象(内存位置相同) +func GetWorkerInstance() *Worker { + + //be sure ,to do this,only once! once.Do(func() { - singleton = &Singleton{} + onlyTheWorker = &Worker{} }) - return singleton + return onlyTheWorker +} + +//Manager Singleton 是单例模式类 +type Manager struct{} + +//better to be pointer +var instance *Manager + +//better to be pointer +var onlyTheManager *Manager + +//////////////////////////////// +//way2 +//使用func init(){}函数来初始化保证,只初始化一次,更简单. +//////////////////////////////// + +func init() { + onlyTheManager = &Manager{} +} + +//GetManagerInstance 总是获取到同一个Manager对象(内存位置相同) +func GetManagerInstance() *Manager { + return onlyTheManager } diff --git a/creation/03_singleton/singleton_test.go b/creation/03_singleton/singleton_test.go index ad7928e..76dc2b8 100644 --- a/creation/03_singleton/singleton_test.go +++ b/creation/03_singleton/singleton_test.go @@ -5,30 +5,58 @@ import ( "testing" ) -const parCount = 100 +const workerCount = 500 -func TestSingleton(t *testing.T) { - ins1 := GetInstance() - ins2 := GetInstance() +func TestWorkerSingleton(t *testing.T) { + ins1 := GetWorkerInstance() + ins2 := GetWorkerInstance() if ins1 != ins2 { - t.Fatal("instance is not equal") + t.Fatal("worker(instance) is not exactly the same") } } -func TestParallelSingleton(t *testing.T) { +// 获取500次,Worker 是否总是同一个worker +func TestParallelWorkerSingleton(t *testing.T) { wg := sync.WaitGroup{} - wg.Add(parCount) - instances := [parCount]*Singleton{} - for i := 0; i < parCount; i++ { + wg.Add(workerCount) + instances := [workerCount]*Worker{} + for i := 0; i < workerCount; i++ { go func(index int) { - instances[index] = GetInstance() + instances[index] = GetWorkerInstance() wg.Done() }(i) } wg.Wait() - for i := 1; i < parCount; i++ { + for i := 1; i < workerCount; i++ { if instances[i] != instances[i-1] { - t.Fatal("instance is not equal") + t.Fatal("Worker instance is not equal") + } + } +} + +func TestManagerSingleton(t *testing.T) { + ins1 := GetManagerInstance() + ins2 := GetManagerInstance() + if ins1 != ins2 { + t.Fatal("Manager(instance) is not exactly the same") + } +} + +// 获取500次,Manager 是否总是同一个Manager +func TestParallelManagerSingleton(t *testing.T) { + wg := sync.WaitGroup{} + wg.Add(workerCount) + instances := [workerCount]*Manager{} + for i := 0; i < workerCount; i++ { + go func(index int) { + instances[index] = GetManagerInstance() + wg.Done() + }(i) + } + wg.Wait() + for i := 1; i < workerCount; i++ { + if instances[i] != instances[i-1] { + t.Fatal("Manager instance is not exactly equal") } } } From 135283eaa8cae355de52e756ed9606070a1d4864 Mon Sep 17 00:00:00 2001 From: Edward Date: Thu, 23 Apr 2020 12:23:28 +0800 Subject: [PATCH 4/8] update factory method & add images --- creation/04_factory_method/README.md | 4 +- creation/04_factory_method/factorymethod.go | 69 ++++++++++-------- .../04_factory_method/factorymethod_test.go | 2 +- creation/05_abstract_factory/README.md | 9 ++- images/abstract-factorys-method.png | Bin 0 -> 68919 bytes 5 files changed, 51 insertions(+), 33 deletions(-) create mode 100644 images/abstract-factorys-method.png diff --git a/creation/04_factory_method/README.md b/creation/04_factory_method/README.md index 9c4c834..e15e4cb 100644 --- a/creation/04_factory_method/README.md +++ b/creation/04_factory_method/README.md @@ -2,4 +2,6 @@ 工厂方法模式使用子类的方式延迟生成对象到子类中实现。 -Go中不存在继承 所以使用匿名组合来实现 +不同的工厂对象,返回一个实现了某接口的类型对象,不同的工厂返回不同实现了相同接口的不同对象,在只能使用特定的类简单工厂的基础上,使用的代码和类生成的灵活性大大增加。 + +Go中的继承关系是使用匿名组合来实现的。 diff --git a/creation/04_factory_method/factorymethod.go b/creation/04_factory_method/factorymethod.go index c8f57d6..6a6f161 100644 --- a/creation/04_factory_method/factorymethod.go +++ b/creation/04_factory_method/factorymethod.go @@ -1,66 +1,77 @@ package factorymethod -//Operator 是被封装的实际类接口 -type Operator interface { - SetA(int) - SetB(int) - Result() int +import "fmt" + +//Assistant 是robot能做的事情 +type Assistant interface { + Clean(int) + Speak(string) + Work() string } -//OperatorFactory 是工厂接口 -type OperatorFactory interface { - Create() Operator +//IRobotFactory must be implemented by Factory +//different Factory create different robot +type IRobotFactory interface { + Build() Assistant } -//OperatorBase 是Operator 接口实现的基类,封装公用方法 -type OperatorBase struct { - a, b int +//BasicRobotModel 是基本的机器人模型 +type BasicRobotModel struct { + words string + a, b int } -//SetA 设置 A -func (o *OperatorBase) SetA(a int) { - o.a = a +//Clean 打扫 +func (o *BasicRobotModel) Clean(a int) { + fmt.Printf("%d", a) } -//SetB 设置 B -func (o *OperatorBase) SetB(b int) { +//Speak 说话 +func (o *BasicRobotModel) Speak(b int) { o.b = b } -//PlusOperatorFactory 是 PlusOperator 的工厂类 -type PlusOperatorFactory struct{} +//Work main work +func (o *BasicRobotModel) Work() string { + fmt.Sprint("my main work is do somthing") +} -func (PlusOperatorFactory) Create() Operator { +//FightingRobotFactory 生产各类军工机器人 +type FightingRobotFactory struct{} + +//Build a robot from FightingRobotFactory +func (FightingRobotFactory) Build() Assistant { return &PlusOperator{ OperatorBase: &OperatorBase{}, } } -//PlusOperator Operator 的实际加法实现 -type PlusOperator struct { - *OperatorBase +//FightingRobot 实际的战斗机器人 +type FightingRobot struct { + *BasicRobotModel } //Result 获取结果 -func (o PlusOperator) Result() int { +func (o FightingRobot) Result() int { return o.a + o.b } -//MinusOperatorFactory 是 MinusOperator 的工厂类 -type MinusOperatorFactory struct{} +//HomeRobotFactory 生产各类家用机器人 +type HomeRobotFactory struct{} -func (MinusOperatorFactory) Create() Operator { +//Build a robot from HomeRobotFactory +func (HomeRobotFactory) Build() Assistant { return &MinusOperator{ OperatorBase: &OperatorBase{}, } } -//MinusOperator Operator 的实际减法实现 -type MinusOperator struct { +//HomeRobot 实际的家用机器人 +type HomeRobot struct { *OperatorBase } //Result 获取结果 -func (o MinusOperator) Result() int { +func (o HomeRobot) Result() int { return o.a - o.b } diff --git a/creation/04_factory_method/factorymethod_test.go b/creation/04_factory_method/factorymethod_test.go index 70f7aa2..04085c4 100644 --- a/creation/04_factory_method/factorymethod_test.go +++ b/creation/04_factory_method/factorymethod_test.go @@ -2,7 +2,7 @@ package factorymethod import "testing" -func compute(factory OperatorFactory, a, b int) int { +func compute(factory IRobotFactory, a, b int) int { op := factory.Create() op.SetA(a) op.SetB(b) diff --git a/creation/05_abstract_factory/README.md b/creation/05_abstract_factory/README.md index 8783b79..96fd58b 100644 --- a/creation/05_abstract_factory/README.md +++ b/creation/05_abstract_factory/README.md @@ -1,8 +1,13 @@ # 抽象工厂模式 -抽象工厂模式用于生成产品族的工厂,所生成的对象是有关联的。 +抽象工厂模式用于生成具有多产品种类生产能力的的工厂,所生成的对象往往是有关联的。 -如果抽象工厂退化成生成的对象无关联则成为工厂函数模式。 +如果抽象工厂退化成生成的对象无关联的或者单一的产品种类则成为工厂函数模式。 + + +参考:[对比](https://blog.csdn.net/wyxhd2008/article/details/5597975) + +![对比图片](../../images/abstract-factorys-method.png) 比如本例子中使用RDB和XML存储订单信息,抽象工厂分别能生成相关的主订单信息和订单详情信息。 如果业务逻辑中需要替换使用的时候只需要改动工厂函数相关的类就能替换使用不同的存储方式了。 diff --git a/images/abstract-factorys-method.png b/images/abstract-factorys-method.png new file mode 100644 index 0000000000000000000000000000000000000000..21c03ed39a7168378bea72bc36a58d3da1613dd5 GIT binary patch literal 68919 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 V5(Yrz`viVTivAF(64Lko{{TlvtLgv% literal 0 HcmV?d00001 From 936f13d150e712c85649993541fe7bd3d2d79ac6 Mon Sep 17 00:00:00 2001 From: Edward Date: Fri, 24 Apr 2020 11:15:47 +0800 Subject: [PATCH 5/8] finsih factory_method --- creation/04_factory_method/factorymethod.go | 47 +++++++++++-------- .../04_factory_method/factorymethod_test.go | 27 ++++++----- 2 files changed, 41 insertions(+), 33 deletions(-) diff --git a/creation/04_factory_method/factorymethod.go b/creation/04_factory_method/factorymethod.go index 6a6f161..0c11014 100644 --- a/creation/04_factory_method/factorymethod.go +++ b/creation/04_factory_method/factorymethod.go @@ -1,6 +1,9 @@ package factorymethod -import "fmt" +import ( + "fmt" + "strconv" +) //Assistant 是robot能做的事情 type Assistant interface { @@ -17,23 +20,25 @@ type IRobotFactory interface { //BasicRobotModel 是基本的机器人模型 type BasicRobotModel struct { - words string - a, b int + words string + workTime int } //Clean 打扫 -func (o *BasicRobotModel) Clean(a int) { - fmt.Printf("%d", a) +func (b *BasicRobotModel) Clean(a int) { + b.workTime = a + fmt.Printf("i can clean :%d hours\n", a) } //Speak 说话 -func (o *BasicRobotModel) Speak(b int) { - o.b = b +func (b *BasicRobotModel) Speak(w string) { + b.words = w + fmt.Printf("my name is: %s\n", w) } //Work main work -func (o *BasicRobotModel) Work() string { - fmt.Sprint("my main work is do somthing") +func (b *BasicRobotModel) Work() string { + return fmt.Sprint("my main work is do somthing") } //FightingRobotFactory 生产各类军工机器人 @@ -41,8 +46,8 @@ type FightingRobotFactory struct{} //Build a robot from FightingRobotFactory func (FightingRobotFactory) Build() Assistant { - return &PlusOperator{ - OperatorBase: &OperatorBase{}, + return &FightingRobot{ + BasicRobotModel: &BasicRobotModel{}, } } @@ -51,9 +56,10 @@ type FightingRobot struct { *BasicRobotModel } -//Result 获取结果 -func (o FightingRobot) Result() int { - return o.a + o.b +//Work for FightingRobot to do some fighting +func (f FightingRobot) Work() string { + fmt.Printf("%s\n", "i can fighting") + return "i can fighting" + strconv.Itoa(f.workTime) } //HomeRobotFactory 生产各类家用机器人 @@ -61,17 +67,18 @@ type HomeRobotFactory struct{} //Build a robot from HomeRobotFactory func (HomeRobotFactory) Build() Assistant { - return &MinusOperator{ - OperatorBase: &OperatorBase{}, + return &HomeRobot{ + BasicRobotModel: &BasicRobotModel{}, } } //HomeRobot 实际的家用机器人 type HomeRobot struct { - *OperatorBase + *BasicRobotModel } -//Result 获取结果 -func (o HomeRobot) Result() int { - return o.a - o.b +//Work robot do some work +func (h HomeRobot) Work() string { + fmt.Printf("%s\n", "i can do homework") + return "i can do homework" + strconv.Itoa(h.workTime) } diff --git a/creation/04_factory_method/factorymethod_test.go b/creation/04_factory_method/factorymethod_test.go index 04085c4..d5e3afc 100644 --- a/creation/04_factory_method/factorymethod_test.go +++ b/creation/04_factory_method/factorymethod_test.go @@ -2,25 +2,26 @@ package factorymethod import "testing" -func compute(factory IRobotFactory, a, b int) int { - op := factory.Create() - op.SetA(a) - op.SetB(b) - return op.Result() +func doWork(factory IRobotFactory, cleanhour int) string { + robot := factory.Build() + robot.Clean(cleanhour) + + robot.Speak("robot name") + + return robot.Work() + } -func TestOperator(t *testing.T) { - var ( - factory OperatorFactory - ) +func TestRobotFactory(t *testing.T) { + var factory IRobotFactory - factory = PlusOperatorFactory{} - if compute(factory, 1, 2) != 3 { + factory = FightingRobotFactory{} + if doWork(factory, 2) != "i can fighting2" { t.Fatal("error with factory method pattern") } - factory = MinusOperatorFactory{} - if compute(factory, 4, 2) != 2 { + factory = HomeRobotFactory{} + if doWork(factory, 1) != "i can do homework1" { t.Fatal("error with factory method pattern") } } From e8318e8b01b7defebe717c4f3371d3ec32626a21 Mon Sep 17 00:00:00 2001 From: Edward Date: Fri, 24 Apr 2020 17:52:24 +0800 Subject: [PATCH 6/8] finish prototype model --- creation/07_prototype/README.md | 4 +- creation/07_prototype/prototype.go | 22 +++++----- creation/07_prototype/prototype_test.go | 58 ++++++++++++++----------- 3 files changed, 46 insertions(+), 38 deletions(-) diff --git a/creation/07_prototype/README.md b/creation/07_prototype/README.md index 62e3ef0..c2bfbe2 100644 --- a/creation/07_prototype/README.md +++ b/creation/07_prototype/README.md @@ -1,5 +1,5 @@ # 原型模式 -原型模式使对象能复制自身,并且暴露到接口中,使客户端面向接口编程时,不知道接口实际对象的情况下生成新的对象。 +原型模式用于快速复制具有相同属性的自身对象. -原型模式配合原型管理器使用,使得客户端在不知道具体类的情况下,通过接口管理器得到新的实例,并且包含部分预设定配置。 +一般是通过实现实现: `Clone()`接口来实现,注意**必须返回新的内存实例**. diff --git a/creation/07_prototype/prototype.go b/creation/07_prototype/prototype.go index 2da0ec6..3ec7ce5 100644 --- a/creation/07_prototype/prototype.go +++ b/creation/07_prototype/prototype.go @@ -1,24 +1,26 @@ package prototype -//Cloneable 是原型对象需要实现的接口 +//Cloneable is the key interface type Cloneable interface { Clone() Cloneable } -type PrototypeManager struct { - prototypes map[string]Cloneable +//cloneLab 克隆实验室,可以克隆很多动物 +type cloneLab struct { + animals map[string]Cloneable } -func NewPrototypeManager() *PrototypeManager { - return &PrototypeManager{ - prototypes: make(map[string]Cloneable), +//new 返回一个 +func newCloneLab() *cloneLab { + return &cloneLab{ + animals: make(map[string]Cloneable), } } -func (p *PrototypeManager) Get(name string) Cloneable { - return p.prototypes[name] +func (c *cloneLab) Get(name string) Cloneable { + return c.animals[name] } -func (p *PrototypeManager) Set(name string, prototype Cloneable) { - p.prototypes[name] = prototype +func (c *cloneLab) Set(name string, newObject Cloneable) { + c.animals[name] = newObject } diff --git a/creation/07_prototype/prototype_test.go b/creation/07_prototype/prototype_test.go index cdde8f5..4b83a5d 100644 --- a/creation/07_prototype/prototype_test.go +++ b/creation/07_prototype/prototype_test.go @@ -2,51 +2,57 @@ package prototype import "testing" -var manager *PrototypeManager +//cloneLab 克隆实验室 +var lab *cloneLab -type Type1 struct { - name string +type sheep struct { + name string + weight int } -func (t *Type1) Clone() Cloneable { - tc := *t +func (s *sheep) Clone() Cloneable { + tc := *s return &tc } -type Type2 struct { - name string +type cow struct { + name string + gender bool } -func (t *Type2) Clone() Cloneable { - tc := *t - return &tc +func (c *cow) Clone() Cloneable { + newCow := &cow{ + gender: c.gender, + name: c.name, + } + return newCow } func TestClone(t *testing.T) { - t1 := manager.Get("t1") - t2 := t1.Clone() + sheep1 := &sheep{ + name: "sheep", + weight: 10, + } - if t1 == t2 { + sheep2 := sheep1.Clone() + + if sheep1 == sheep2 { t.Fatal("error! get clone not working") } } -func TestCloneFromManager(t *testing.T) { - c := manager.Get("t1").Clone() +func TestCloneFromLab(t *testing.T) { - t1 := c.(*Type1) - if t1.name != "type1" { + lab := newCloneLab() + + lab.Set("cow", &cow{name: "i am cow", gender: true}) + + c := lab.Get("cow").Clone() + + cw := c.(*cow) + if cw.name != "i am cow" { t.Fatal("error") } } - -func init() { - manager = NewPrototypeManager() - - t1 := &Type1{ - name: "type1", - } - manager.Set("t1", t1) -} From d4c3346164ca35878cced36a1db6c204da34c001 Mon Sep 17 00:00:00 2001 From: Edward Date: Fri, 24 Apr 2020 18:09:58 +0800 Subject: [PATCH 7/8] add objectpool model --- creation/05_abstract_factory/README.md | 1 - creation/24_object_pool/README.md | 3 +++ creation/24_object_pool/obejct_poo.go | 23 +++++++++++++++++++++ creation/24_object_pool/object_pool_test.go | 20 ++++++++++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 creation/24_object_pool/README.md create mode 100644 creation/24_object_pool/obejct_poo.go create mode 100644 creation/24_object_pool/object_pool_test.go diff --git a/creation/05_abstract_factory/README.md b/creation/05_abstract_factory/README.md index 96fd58b..9b39e34 100644 --- a/creation/05_abstract_factory/README.md +++ b/creation/05_abstract_factory/README.md @@ -4,7 +4,6 @@ 如果抽象工厂退化成生成的对象无关联的或者单一的产品种类则成为工厂函数模式。 - 参考:[对比](https://blog.csdn.net/wyxhd2008/article/details/5597975) ![对比图片](../../images/abstract-factorys-method.png) diff --git a/creation/24_object_pool/README.md b/creation/24_object_pool/README.md new file mode 100644 index 0000000..dc28c10 --- /dev/null +++ b/creation/24_object_pool/README.md @@ -0,0 +1,3 @@ +# Object Pool Pattern + +对象池创建模式,用于一次性准备大量的预置对象 diff --git a/creation/24_object_pool/obejct_poo.go b/creation/24_object_pool/obejct_poo.go new file mode 100644 index 0000000..15c9dc8 --- /dev/null +++ b/creation/24_object_pool/obejct_poo.go @@ -0,0 +1,23 @@ +package objectpool + +type doctor struct { + name string + kind int //科室 +} + +type pool chan *doctor + +func newPool(total int) pool { + p := make(pool, total) + + for i := 0; i < total; i++ { + p <- new(doctor) + } + + return p +} + +//surgery +func (d doctor) surgery() { + +} diff --git a/creation/24_object_pool/object_pool_test.go b/creation/24_object_pool/object_pool_test.go new file mode 100644 index 0000000..2e7baa6 --- /dev/null +++ b/creation/24_object_pool/object_pool_test.go @@ -0,0 +1,20 @@ +package objectpool + +import ( + "testing" +) + +func TestObjectPool(t *testing.T) { + + p := newPool(2) + + select { + case obj := <-p: + obj.surgery( /*...*/ ) + + p <- obj + default: + // No more objects left — retry later or fail + return + } +} From 7340715d29e229526c4a3136467b3399c0fbcdf7 Mon Sep 17 00:00:00 2001 From: Edward Date: Fri, 24 Apr 2020 18:10:26 +0800 Subject: [PATCH 8/8] update README.md for Object Pool --- creation/24_object_pool/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/creation/24_object_pool/README.md b/creation/24_object_pool/README.md index dc28c10..ecffe10 100644 --- a/creation/24_object_pool/README.md +++ b/creation/24_object_pool/README.md @@ -1,3 +1,3 @@ -# Object Pool Pattern +# Object Pool -对象池创建模式,用于一次性准备大量的预置对象 +对象池创建模式,根据业务和执行的需要,用于一次性准备大量的预置对象