写些想写的
1.flyweight,好吧,比轻量级还轻的拳击手,不知到gof为什么取这一个名字,求好心人留言。
2.很多时候,大概是要用的对象太多了,就有人想着提取他们中固定不变的部分(intrinsic state),让他们只占用一份内存,单例也是如此,但对于前者,一种intricate state对应使用一个对象,而单例模式,不管你有多少个对象只使用一份内存地址。
3.说到“固定不变”的问题,更类似于数据库设计中的优化 SC(Sno,Sname,Cno,Cname,Teacher),C表示课程Course,S表示Student。关系SC中主键为(Sno,Cno),Cno->(Cname,Teacher)只是部分依赖主键,不满足2NF。简单的改下SC(Sno,Sname,Cno),C(Cno,Cname,Teache)。算了,写不下去了,这太牵强了,数据库的课刚结束还有后遗症,原谅我。
4.Sno的数量远远大Cname和Teacher的组合,不同的student对象中有大量像“数据结构+胡**”这样重复的部分。可以想象不管是数据库设计中的数据冗余,还是享元模式中的内存问题,将Cname和Teacher分离出去都是有好处的。again:这分离出来的Cname+Teacher组合(也就是所谓的FlyWeight的对象们)的个数是要固定的,至于谁来产生存储他们,就交给FlyWeightFactory吧
5.对象池,看了些关于享元模式的blog,既然有人提及了这种“高端”的东西,那果断要下个commoms-pool来装下那个什么。导入编译后,总共就两个包,10来个java文件,瞎弄了一下午,源代码中精华的同步控制也被我删的差不多了,说说剩下的:ObjectPool作为接口提供存储管理PooledObject对象的方法,而PooledObject是Object和其当前state的封装,回到ObjectPool的其中一个具体实现GenericObjectPool:
ConcurrentHashMap<T,PooledObject<T>> allObject:存储添加的object(泛型不作过多说明);LinkedBlockingDeque<PooledObject<T>> idleobjects:存储空闲的PooledObject;
另外不得不说的是对象生命周期的控制,commom-pool提供PoolableObjectFactory这样的接口,用户实现其中的activateObject(T),destoryObject(T),makeObject(),passivateObject(T),validateObject(T)方法,这也是对象池的意义所在,我们只是维护这些对象,并未重复生成,或当做垃圾回收。对于那些生成新对象开销过大的类,如数据库连接,线程,使用对象池就能很好地提高系统性能。borrowObject():向idleObjects队列中拿到一个空闲的对象(根据lifo的值决定是是first还是last),若队列为 空,create()一个新的PooledObject并放入allObject中;
returnObject(T obj)将obj对象不使用时添加回idleObjects。invalidateObject(T obj)使ObjectPool中相应obj无效,从allObjects和idleObjects中移除;
其他如clear(),close(),getNumIdle()不具体提了;
6.享元的理解:让存在的重复使用。
7.继续中……
享元模式与对象池技术深入解读
1638

被折叠的 条评论
为什么被折叠?



