Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 259|回复: 0

[设计模式学习]Java设计模式:Flyweight模式

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-5 00:01:40 | 显示全部楼层 |阅读模式
    GOF:运用共享技术有效地支持大量细粒度的对象。

         解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说(这里引用GOF书中的例子)一个文本系统,每个字母定一个对象,那么大小写字母一共就是52 个,那么就要定义 52个对象。如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都共享一个对象,那么就大大节约了资源。

         在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory 模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对象。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度.应用场合很多,下面举个例子:

    先定义一个抽象的Flyweight类:  
      
       
       
         
       

         
       
      

    package Flyweight;

    public abstract class Flyweight
    ...
    {
    public abstract void operation();
    }//end abstract class Flyweight


    在实现一个具体类:

    package Flyweight;

    public class ConcreteFlyweight extends Flyweight
    ...
    {
    private String string;
    public ConcreteFlyweight(String str)
    ...
    {
    string = str;
    }//end ConcreteFlyweight(...)

    public void operation()
    ...
    {
    System.out.println("Concrete---Flyweight : " + string);
    }//end operation()

    }//end class ConcreteFlyweight


    实现一个工厂方法类:

    package Flyweight;
    import java.util.Hashtable;

    public class FlyweightFactory
    ...
    {
    private Hashtable flyweights = new Hashtable();//----------------------------1
    public FlyweightFactory() ...{}

    public Flyweight getFlyWeight(Object obj)
    ...
    {
    Flyweight flyweight = (Flyweight) flyweights.get(obj);//----------------2

    if(flyweight == null) ...{//---------------------------------------------------3
    //产生新的ConcreteFlyweight
    flyweight = new ConcreteFlyweight((String)obj);
    flyweights.put(obj, flyweight);//--------------------------------------5
    }
    return flyweight;//---------------------------------------------------------6
    }//end GetFlyWeight(...)

    public int getFlyweightSize()
    ...
    {
    return flyweights.size();
    }
    }//end class FlyweightFactory


    这个工厂方法类非常关键,这里详细解释一下:

    在1处定义了一个Hashtable用来存储各个对象;在2处选出要实例化的对象,在6处将该对象返回,如果在Hashtable中没有要选择的对象,此时变量flyweight为null,产生一个新的flyweight存储在Hashtable中,并将该对象返回。

    最后看看Flyweight的调用:

    package Flyweight;
    import java.util.Hashtable;

    public class FlyweightPattern ...{
    FlyweightFactory factory = new FlyweightFactory();
    Flyweight fly1;
    Flyweight fly2;
    Flyweight fly3;
    Flyweight fly4;
    Flyweight fly5;
    Flyweight fly6;

    /** *//** Creates a new instance of FlyweightPattern */
    public FlyweightPattern() ...{
    fly1 = factory.getFlyWeight("Google");
    fly2 = factory.getFlyWeight("Qutr");
    fly3 = factory.getFlyWeight("Google");
    fly4 = factory.getFlyWeight("Google");
    fly5 = factory.getFlyWeight("Google");
    fly6 = factory.getFlyWeight("Google");
    }//end FlyweightPattern()

    public void showFlyweight()
    ...
    {
    fly1.operation();
    fly2.operation();
    fly3.operation();
    fly4.operation();
    fly5.operation();
    fly6.operation();
    int objSize = factory.getFlyweightSize();
    System.out.println("objSize = " + objSize);
    }//end showFlyweight()

    public static void main(String[] args)
    ...
    {
    System.out.println("The FlyWeight Pattern!");
    FlyweightPattern fp = new FlyweightPattern();
    fp.showFlyweight();
    }//end main(...)
    }//end class FlyweightPattern


    下面是运行结果:

    Concrete---Flyweight : Google
    Concrete---Flyweight : Qutr
    Concrete---Flyweight : Google
    Concrete---Flyweight : Google
    Concrete---Flyweight : Google
    Concrete---Flyweight : Google
    objSize = 2


    我们定义了6个对象,其中有5个是相同的,按照Flyweight模式的定义“Google”应该共享一个对象,在实际的对象数中我们可以看出实际的对象却是只有2个。

    下面给出一个简易的UML图:




    总结:

    Flyweight(享元)模式是如此的重要,因为它能帮你在一个复杂的系统中大量的节省内存空间。在GOF的书中举了文本处理的例子,我觉得非常恰当。那么,在Java中String这个类型比较特殊,为什么呢,看下面的例子:

    String a = "hello";
    String b = "hello";
    if(a == b)
    System.out.println("OK");
    else
    System.out.println("Error");


    输出结果是:OK。稍有经验的人都可以看出if条件比较的是两a和b的地址,也可以说是内存空间。那么Sting的实现是不是使用了Flyweight模式呢,不得而知,到现在还没有研究过。  

      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 13:10 , Processed in 0.301901 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表