什么是享元模式?
运用共享技术有效地支持大量细粒度的对象。
实现
// 具体网站类
type ConcreteWebSite struct {
name string
}
func NewConcreteWebSite(name string) *ConcreteWebSite {
return &ConcreteWebSite{name: name}
}
func (this *ConcreteWebSite) use() {
fmt.Println("网站分类:", this.name)
}
// 网络工厂类
type WebSiteFactory struct {
pool map[string]*ConcreteWebSite
}
// 获得网站分类
func (this *WebSiteFactory)GetWebSiteCategory(key string) *ConcreteWebSite {
if _, ok := this.pool[key]; !ok {
this.pool[key] = NewConcreteWebSite(key)
}
return this.pool[key]
}
func (this *WebSiteFactory)GetSiteCount() int {
return len(this.pool)
}
func NewWebSiteFactory(pool map[string]*ConcreteWebSite) *WebSiteFactory {
return &WebSiteFactory{pool:pool}
}
func TestNewWebSiteFactory(t *testing.T) {
factory := NewWebSiteFactory(make(map[string]*ConcreteWebSite))
fx := factory.GetWebSiteCategory("产品展示")
fx.use()
fy:= factory.GetWebSiteCategory("产品展示")
fy.use()
fz:= factory.GetWebSiteCategory("产品展示")
fz.use()
fa:= factory.GetWebSiteCategory("博客")
fa.use()
fb:= factory.GetWebSiteCategory("博客")
fb.use()
fc:= factory.GetWebSiteCategory("博客")
fc.use()
fmt.Println("网站分类总数为: ", factory.GetSiteCount())
}
// === RUN TestNewWebSiteFactory
// 网站分类: 产品展示
// 网站分类: 产品展示
// 网站分类: 产品展示
// 网站分类: 博客
// 网站分类: 博客
// 网站分类: 博客
// 网站分类总数为: 2
// --- PASS: TestNewWebSiteFactory (0.00s)
// PASS
优点
- 大大减少了对象的创建,降低了程序内存的占用,提高效率。
缺点
- 提高了系统的复杂度。需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变。
使用场景
- 系统中存在大量相似对象;
- 需要缓冲池的场景,例如:数据库连接池。
注意
- 注意划分内部状态和外部状态,否则可能会引起线程安全问题;
- 这些类必须有一个工厂类加以控制。