享元模式(FlyWeight)
内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存。
节省了内存,有些时候,会造成运行时间的加长。
核心:
享元模式以共享的方式高效地支持大量细粒度对象的重用
享元对象能做到共享的关键是区分了内部状态和外部状态。
内部状态:可以共享,不会随环境变化而改变。
外部状态:不可以共享,会随环境变化而改变。
围棋软甲设计:
每个围棋棋子都是一个对象:
有如下对象:
颜色
形状 这些事可以共享的,称之为内部状态
大小
位置: 这些不可以共享称之为外部状态。
我们可以看到,在一局棋中,可以有几十或者几百个黑白棋子,但是我们考察这些棋子对象,会发现,所有的黑色棋子或者白色的棋子,他们的颜色,形状,大小都是一样的。这些一样的属性,在享元模式中我们称之为内部状态
而每个棋子的位置都是不一样的,这类属性称之为外部状态
享元模式实现:
FlyweightFactory享元工厂类: 创建并管理享元对象(也就是享元模式通常要和工厂模式搭配起来),享元池一般设置为键值对
FlyWeight抽象享元类 通常是一个接口或者抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。
ConcreteFlyWeight具体享元类 为内部状态提供成员变量进行存储(如棋子的颜色,形状,大小)
UnsharedConcreteFlyWeight非共享享元类 不能被共享的子类可以设计为非共享享元类。(如棋子的位置)
应用场景:
享元模式由于其共享的特性,可以在任何池中操作,比如,线程池,数据库连接池。
String类的设计也是享元模式。(共享常量池中的对象)
优点:
极大减少了内存中对象的数量
相同或相似对象内存只存一份,极大地节约资源,提高系统性能
外部状态相对独立,不影响内部状态
缺点:
模式较为复杂,使得程序逻辑复杂化
为了节省内存,共享了内部状态,分离出外部状态,而读取外部状态使运行时间变长。用时间换取了空间。
原文地址:http://blog.csdn.net/lk142500/article/details/44946771