码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-09 08:57:47      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:gof23   设计模式   享元模式i   


技术分享
享元模式(FlyWeight

     内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存。

     节省了内存,有些时候,会造成运行时间的加长。

核心:

     享元模式以共享的方式高效地支持大量细粒度对象的重用

     享元对象能做到共享的关键是区分了内部状态和外部状态。

         内部状态:可以共享,不会随环境变化而改变。

         外部状态:不可以共享,会随环境变化而改变。

 

围棋软甲设计:

     每个围棋棋子都是一个对象:

     有如下对象:

技术分享
         颜色

         形状       这些事可以共享的,称之为内部状态

         大小

     位置: 这些不可以共享称之为外部状态。

     我们可以看到,在一局棋中,可以有几十或者几百个黑白棋子,但是我们考察这些棋子对象,会发现,所有的黑色棋子或者白色的棋子,他们的颜色,形状,大小都是一样的。这些一样的属性,在享元模式中我们称之为内部状态

     而每个棋子的位置都是不一样的,这类属性称之为外部状态

 

     享元模式实现:

  • FlyweightFactory享元工厂类:
    
    创建并管理享元对象(也就是享元模式通常要和工厂模式搭配起来),享元池一般设置为键值对
  • FlyWeight抽象享元类
    
    通常是一个接口或者抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。
  • ConcreteFlyWeight具体享元类
    
    为内部状态提供成员变量进行存储(如棋子的颜色,形状,大小)
  • UnsharedConcreteFlyWeight非共享享元类
    
    不能被共享的子类可以设计为非共享享元类。(如棋子的位置)







应用场景:

     享元模式由于其共享的特性,可以在任何池中操作,比如,线程池,数据库连接池。

     String类的设计也是享元模式。(共享常量池中的对象)

 

优点:

     极大减少了内存中对象的数量

     相同或相似对象内存只存一份,极大地节约资源,提高系统性能

     外部状态相对独立,不影响内部状态

缺点:

     模式较为复杂,使得程序逻辑复杂化

     为了节省内存,共享了内部状态,分离出外部状态,而读取外部状态使运行时间变长。用时间换取了空间。

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

标签:gof23   设计模式   享元模式i   

原文地址:http://blog.csdn.net/lk142500/article/details/44946771

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!