对象池设计模式介绍:
对象池设计模式是一种在初始化时创建一组对象放在一个"池"里面进行复用的设计模式。当一个客户端需要一个对象时,它并非直接创建,而是向对象池请求。如果对象池中有闲置的对象,它就会返回一个,否则创建一个新的对象给客户端。同样,当客户端完成了对对象的使用,它不直接销毁这个对象,而是放回对象池中,供下次或其他客户端使用。
对象池设计模式的主要目标是性能优化和资源管理。通过对象复用,可以减少创建和销毁对象的开销。同时,通过管理对象的数量,可以有效地控制系统中对象的数量,避免资源过度消耗
对象池设计模式的应用场景
对象池设计模式适用于以下场景:
- 对象的创建和销毁开销大:如果创建一个对象的开销很大,如数据库大数据
- 有并发限制的资源:如果对象代表了有并发限制的资源,如数据库连接数的限制,那么使用对象池可以帮助我们限制并发数量,避免超出资源的限制。
- 频繁请求和释放的资源:如果一个对象会被频繁地创建和销毁,那么使用对象池可以减少创建和销毁对象的次数,减轻系统的负担
对象池设计模式的优缺点
优点
- 性能优化:对象池通过复用对象,减少了创建和销毁对象的开销,从而提高了系统的性能。
- 资源管理:对象池可以限制系统中对象的数量,避免过多的对象消耗过多的资源。
缺点
- 复杂性增加:使用对象池设计模式会增加代码的复杂性。我们需要管理对象池中对象的创建、使用和回收。
- 资源浪费:如果对象池中的对象长时间不被使用,那么这些对象会一直占用资源,造成资源浪费。
快速上手:
对象池技术是一种常用的内存管理技术,它通过预先创建一定数量的对象并在需要的时重复使用这些对象,
以减少内存分配和回收的开销,进而提高程序的性能,go中的对象池,通常使用sync.Pool 实现
sync.Pool定义如下
type Pool struct{
new func() interface{}
}
其中,new字段指定一个函数,用于返回一个新的对象,Pool对象包含两个公共方法:Get 和 Put
Get 方法用于从对象池中获取一个可用的对象。如果对象池中存在可用对象,则Get方法会直接返回该对象;否则,会调用New函数创建一个新的对象并返回
Put方法用于将一个对象还回对象池中,以供后续的使用。如果对象池已满,则put方法对丢弃该对象而不做任何处理。
一些代码解释:
type Pool struct { New func() interface{} }
在 sync.Pool 类型中,New 是一个函数类型的字段,用于在需要创建新对象时调用。具体来说,它是一个无参函数,返回值为 interface{} 类型,即可以返回任意类型的值。该函数的类型定义如下:
func() interface{}
可以看到,这个函数没有参数,只有一个返回值,且返回值的类型为 interface{}。因此,我们可以通过 New 函数动态地创建一个新的对象,并将其包装在 interface{} 类型中返回。例如:
解释p := sync.Pool{ New: func() interface{} { return &Person{name: "Jack"} }, }
这里我们使用了匿名函数来定义 New 字段,该函数返回类型为 interface{},实际上它返回的是一个 *Person 类型的指针,表示创建了一个新的 Person 对象,且该对象的 name 属性为 "Jack"。在使用对象池时,如果当前池中不存在可用的对象,则会调用 New() 方法来创建一个新的对象。
需要注意的是,当我们从对象池中获取一个对象时,该对象的类型是由 New 函数来决定的,而不是由 sync.Pool 类型的定义来决定的。因此,我们必须确保 New 函数返回的对象类型与我们使用对象池的代码中所期望的类型是一致的。
参考: