品牌网站建设

psd转xhtml/css 88元/页起

  • 符合W3C标准的XHTML/CSS编码
  • 多浏览器及操作平台支持
  • SEO(搜索引擎)语义代码标准
  • 经过优化的和切片图像
  • 结构良好的XHTML/CSS
  • 转换页面越多,折扣越多
更多优惠

手机13146413981qq393992480msnyibing98@hotmail.com

意图

       运用共享技术有效地支持大量细粒度的对象。

场景

在比较底层的系统或者框架级的软件系统中,通常存在大量细粒度的对象。即使细力度的对象,如果使用的数量级很高的话会占用很多资源。比如,游戏中可能会在无数个地方使用到模型数据,虽然从数量上来说模型对象会非常多,但是从本质上来说,不同的模型可能也就这么几个。

此时,我们可以引入享元模式来共享相同的模型对象,这样就可能大大减少游戏对资源(特别是内存)的消耗。

示例代码

using System;

using System.Collections;

using System.Text;

using System.IO;

 

namespace FlyweightExample

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine(GC.GetTotalMemory(false));

            Random rnd = new Random();

            ArrayList al = new ArrayList();

            for (int i = 0; i < 10000; i++)

            {

                string modelName = rnd.Next(2).ToString();

                Model model = ModelFactory.GetInstance().GetModel(modelName);

                //Model model = new Model(modelName);

                al.Add(model);

            }

            Console.WriteLine(GC.GetTotalMemory(false));

            Console.ReadLine();

        }

    }

 

    class Model

    {

        private byte[] data;

 

        public Model(string modelName)

        {

            data = File.ReadAllBytes("c:\\" + modelName + ".txt");

        }

    }

 

    class ModelFactory

    {

        private Hashtable modelList = new Hashtable();

        private static ModelFactory instance;

 

        public static ModelFactory GetInstance()

        {

            if (instance == null)

                instance = new ModelFactory();

            return instance;

        }

 

        public Model GetModel(string modelName)

        {

            Model model = modelList[modelName] as Model;

            if (model == null)

                modelList.Add(modelName, new Model(modelName));

            return model;

        }

    }

}

代码执行结果如下图(前面是使用享元模式的结果,后面是没有使用享元模式的结果)

 

代码说明

·这里的ModelFactory就是享元工厂角色。它的作用是创建和管理享元对象。可以看到,每加载一个模型都会在Hashtable中记录一下,之后如果客户端还是需要这个模型的话就直接把已有的模型对象返回给客户端,而不是重新在内存中加载一份模型数据。

·ModelFactory本身应用了Singleton,因为如果实例化多个享元工厂是的话就起不到统一管理和分配享元对象的目的了。

·Model就是享元角色。在构造方法中传入modelName,然后它从指定路径加载模型数据,并且把数据放入字段中。

·从代码的运行结果中可以看到,如果没有应用享元模式,那么在内存中就会有10000套模型对象,由于一共就2个模型,所以9998个对象是可以通过享元来消除的。

何时采用

·系统中有大量耗费了大量内存的细粒度对象,并且对外界来说这些对没有任何差别的(或者说经过改造后可以是没有差别的)。

实现要点

·享元工厂维护一张享元实例表。

·享元不可共享的状态需要在外部维护。

·按照需求可以对享元角色进行抽象。

注意事项

·享元模式通常针对细粒度的对象,如果这些对象比较拥有非常多的独立状态(不可共享的状态),或者对象并不是细粒度的,那么就不适合运用享元模式。维持大量的外蕴状态不但会使逻辑复杂而且并不能节约资源。

· 享元工厂中维护了享元实例的列表,同样也需要占用资源,如果享元占用的资源比较小或者享元的实例不是非常多的话(和列表元素数量差不多),那么就不适合使用享元,关键还是在于权衡得失。

Add comment


 

biuquote
  • Comment
  • Preview
微笑得意调皮害羞酷大笑惊讶发呆喜欢可怜尴尬闭嘴噘嘴皱眉伤心抓狂呕吐坏笑漫骂发怒
Loading



订阅新易网博客

  • 订阅到抓虾
  • 哪吒提醒
  • pageflakes
  • Add to My Yahoo!
  • Add to Google
  • 鲜果阅读器订阅图标
  • 订阅到有道阅读
  • 用QQ邮箱阅读空间订阅我的博客。
专业设计 量身定制 品牌网站建设 体验价只需999元
.me 我要我的域名 新网域名 260元/年 再送空间100M
印彩色名片,每盒仅5元
免费推广您的网站或产品 互换广告位、友情连接、软文

Recent comments