Flyweight

概述:

共享对象,避免浪费,即通过尽量共享实例来避免new出实例

Flyweight_sample


说明:

1.本文仅仅是对 图解设计模式 的简单总结(个人笔记).
2.文章中的图片均来自本书,添加水印只是为了防止盗链行为,并无侵权的想法.
综上,若侵权, 请联系删除!
转载请标注出处!


案例:

  • 案例说明:

    将许多普通字符组合成为”大写字符的类”

  • Flyweight_uml_case

  • 主要代码:

  • BigCharFactory.java

    package Gof.Flyweight;
    
    import java.util.HashMap;
    
    public class BigCharFactory {
        // 管理已经生成的BigChar的实例
        private HashMap pool = new HashMap();
        // Singleton模式
        private static BigCharFactory singleton = new BigCharFactory();
        // 构造函数
        private BigCharFactory() {
        }
        // 获取唯一的实例
        public static BigCharFactory getInstance() {
            return singleton;
        }
        // 生成(共享)BigChar类的实例
        public synchronized BigChar getBigChar(char charname) {
            BigChar bc = (BigChar)pool.get("" + charname);
            if (bc == null) {
                bc = new BigChar(charname); // 生成BigChar的实例
                pool.put("" + charname, bc);
            }
            return bc;
        }
    }
    
  • 代码链接:传送门

    uml综述Flyweight_uml

  • Flyweight: 表示被共享的类

  • FlyweightFactory: 生成Flyweight角色的工厂

  • Client: 使用FlyweightFactory生成Flyweight角色

收获:

  • 共享的特点: 修改一处,会对多个地方产生影响

  • Java通过new 分配内存空间,分配过多,导致内存不足,jvm开始运行gc算法,回收垃圾(处理堆空间中不在不使用的对象),释放没有被使用的实例

  • 计算机资源:内存,时间片,文件句柄,和窗口句柄(最后两个: 在os中,可以操控的handler 是有限的,若果不共享实例,很容易达到资源的极限而崩溃)

  • Intrinsic信息与extrinsic信息

     |intrinsic信息|不依赖于位置与状况,可以共享|
     |-|-|
     |extrinsic信息| 依赖于位置与状况,不能共享|

相关设计模式:

  • proxy : 若生成实例需要花费较长时间,可以使用Flyweight减少这部分时间,而proxy则是通过设置代理提过程序的处理速度
  • composite: 可以使用Flyweight来共享composite模式中的leaf角色
  • singleton:

注意:

此部分内容属于对GOF Design Pattern知识的初步认知阶段,参考书籍是结城浩的《图解设计模式》,简单易懂,十分推荐!
以上内容,作者一字一句码出来的,纯属不易,欢迎大家转载,转载是还请您表明出处。另外如果我有侵权行为,请在下方留言,确认后我会及时撤销相应内容,谢谢大家!

PS: 欢迎大家来到我的小站,鸣谢!