首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,首先说享元的含义,享元即有共享单元的意思。它主要解决的问题是创建大量相似对象时的内存开销问题。该模式通过共享具有相同状态的对象来减少内存使用量

当一个系统中存在大量重复对象,若这些重复的对象是不可变对象,就能利用享元模式将对象设计成享元,在内存中只保留一份实例,供引用。这就减少内存中对象的数量,最终节省内存。

"不可变对象":一旦通过构造器初始化完成后,其状态(对象的成员变量或属性)就不会再被修改。所以,不可变对象不能暴露任何 set()等修改内部状态的方法。之所以要求享元是不可变对象,是因为它会被多处代码共享使用,避免一处代码对享元进行了修改,影响到其他使用它的代码。

共享对象的状态分为内部状态外部状态,内部状态在各个对象间共享,而外部状态由客户端传入,这一点一定要牢记

优点

大大减少对象的创建,降低系统的内存,使效率提高。

缺点

提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

类图解析

由上图可以看出由 3 部分组成

Flyweight:享元接口,定义所有对象共享的操作

ConcreteFlyweight:具体的要被共享的对象,其一般是一个不可变类,内部只保存需要共享的内部状态,它可能不止一个。

FlyweightFactory:负责给客户端提供共享对象

代码实例

其实在示例上我一直想靠游戏来进行说明,但是很抱歉并没有那一款游戏符合。而网络上更多的是以五子棋为例,那就以五子棋为例吧。其实这是因为这里需要大量的棋子对象,它们除了颜色有黑白之分,摆放的位置不同其他都一样,非常适合使用享元模式

客户端代码

核心代码

执行结果

从调用的情况看,下了 3 次黑棋,而每一次黑棋的内存地址都是相同的,说明并没有创建新的对象

结语

最后说一下设计模式是 1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF 设计模式」

至此设计模式部分就彻底的完结了,虽然很多人不喜欢这个系列。接下来我暂时不知道该更新什么系列内容了,暂时定为网络编程吧!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OIUbFTmnuTsVm23geoDRA7Pg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券