GOF23设计模式之享元模式之理解

来源:互联网 发布:软件缺陷分析方法 编辑:程序博客网 时间:2024/06/05 00:14

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