共同的天空(FlyWeight)

原创 2003年07月14日 08:07:00

 

很多情况下.大量的类似之处使得我们不得不为重复的数据使用少的可怜的内存.这样

的情况很糟糕.既然如此.我们必须找到一个好的办法.把那些可能重复的数据统一管理

这样是在合理不过的事情了.好的..我们应该从如下几个方面来考虑.首先要找出对象之

间的共同之处.这部分是可以共享.那么就需要封装到一个类中.那么剩下的不能共享的

就只好封装到另外的类中.换句话说.就是把对象的粒度扩大.让FlyWeight来控制原本

可能多个小粒度的对象.并把可共享的地方共享.形成统一管理.而可共享的部分必须

动态产生.显然是要用到Factory模式.这也就是FlyWeight很多情况都利用了厂模式.

并且工厂维护着一个共享池.这个池的作用就是为了使得.客户程序能充实际内存中

读取共享数据.如果客户搜索到数据.那么就返回一个共享对象.如果没有找到.那么就

加入到这个共享池中.
abstract class Flyweight
{
   abstract public void Execute( OtherData oData );
}

下面考虑一个可能遇到的问题.假如某个出版社.的数据库是这样的

书号 作者 出版日期  价格

那么这里除了书号以外都又可能出现很大的重复.为了使内存减小投入我们可以考虑使用

FlyWeight模式.

public class Book{
   private int bookNum;
   private string  Author;
   private DateTime pubDate;
   private float  price;
   public void Execute(){}
}

由此可以看出.Book中的大部分数据都又可能重复.那样会浪费很多的内存.那么我们来进行又效

的共享管理.

public class AuthorFlyWeight : FlyWeight{
    private string author;
    public string Author{
          get{return author;}
          set{author=value;}
    }
}

public class pubDateFlyWeight : FlyWeight{
    private DateTime pubDate;
    public DateTime PubDate{
          get{return pubDate;}
          set{pubDate=value;}
    }
}

public class PriceFlyWeight : FlyWeight{
    private float price;
    public float  Price{
          get{return price;}
          set{price=value;}
    }
}

//抽象工厂
abstract class FlyweightFactory{
  //存储数据
   protect Hashtable pool = new Hashtable();
 
  public abstract Flyweight getFlyweight(string key){
}
}


public class AuthorFactory:FlyweightFactory{
   public override Flyweight getFlyweight(string key){
           AuthorFlyWeight reValue;
           reValue = (AuthorFlyWeight)pool.get(key);
    
    if(reValue == null) {
      reValue = new AuthorFlyWeight();
      pool.put(key,reValue);
      
    }
    return reVale;

}
}


后面与之类似..那么FlyWight模式我就介绍到这里....

Flyweight模式详解--设计模式(10)

Flyweight模式产生原因:         在面向对象系统的设计何实现中,创建对象是最为常见的操作。这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销。特别是对于大量轻...
  • fanyun_01
  • fanyun_01
  • 2016年06月29日 08:47
  • 1703

boost::flyweight使用

今天在看书的时候看到了boost.flyweight这个库,设计模式里面讲到了flyweight是一种设计模式,那这个库是干啥的呢?       什么是flyweight?       简单点说,...
  • zirandeai
  • zirandeai
  • 2012年12月12日 22:06
  • 1760

常见设计模式解析和实现(C++)FlyWeight模式

作用:运用共享技术有效地支持大量细粒度的对象   UML结构图:   解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用。比如,在QQ聊天...
  • zhuhongshu
  • zhuhongshu
  • 2014年09月18日 23:42
  • 1169

浅谈JAVA设计模式之——享元模式(Flyweight)

一、概述 运用共享技术有效地支持大量细粒度的对象。 二、适用性 当都具备下列情况时,使用Flyweight模式:        1.一个应用程序使用了大量的对象。        2.完全由于使用大...
  • l1028386804
  • l1028386804
  • 2015年05月07日 23:46
  • 1684

C++设计模式13----Flyweight享元模式

Flyweight享元模式概述 作用:运用共享技术有效地支持大量细粒度的对象。 内部状态intrinsic和外部状态extrinsic: 1)Flyweight模式中,最重要的是将对象分解成intri...
  • gatieme
  • gatieme
  • 2015年02月09日 20:46
  • 12055

设计模式(结构型)之享元模式(Flyweight Pattern)

当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。所以需要采用一个共享来避免大量拥有相同内容对象的开销。在Java中,String类型就是使用了享元模式。Strin...
  • yanbober
  • yanbober
  • 2015年05月04日 14:15
  • 3189

[shader]动态天空球

实现Unity中动态天空昼夜交替等效果,懂的可以加云等天气变换
  • carefreeq
  • carefreeq
  • 2016年11月16日 11:16
  • 1286

浅谈Java设计模式(十二)享元模式(Flyweight)

前言: 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。 FlyWeightFactory负责创建和管理享元单元,当一...
  • caihongdao123
  • caihongdao123
  • 2016年07月11日 10:02
  • 2400

图片天空区域识别

本文主介绍了一下一种天空区域识别的算法,参考论文:Sky Region Detection in a Single Image for Autonomous Ground Robot Navigati...
  • zhubaohua_bupt
  • zhubaohua_bupt
  • 2016年10月09日 22:14
  • 2164

#ThreeJS#之外景天空盒子

使用立方体贴上图片材质后实现天空盒子,可以作为房间外部的场景
  • hbzhlt
  • hbzhlt
  • 2017年03月27日 16:57
  • 738
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:共同的天空(FlyWeight)
举报原因:
原因补充:

(最多只允许输入30个字)