设计模式——享元模式

什么是享元模式?

运用共享技术有效地支持大量细粒度的对象。

实现

// 具体网站类
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

优点

  • 大大减少了对象的创建,降低了程序内存的占用,提高效率。

缺点

  • 提高了系统的复杂度。需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变。

使用场景

  • 系统中存在大量相似对象;
  • 需要缓冲池的场景,例如:数据库连接池。

注意

  • 注意划分内部状态和外部状态,否则可能会引起线程安全问题;
  • 这些类必须有一个工厂类加以控制。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容