天天看点

一天一个设计模式之享元模式(flyweight)

设计模式,这个东西一直都有耳闻,也曾经研究过一段时间,不过早已经忘记了,现在打算重新捡回来,所以在这里放出我再次学习的心得体会。

Flyweight,俗称 享元模式,曾经我好像在那本书上,翻译成飞行模式,我狂汗,当是我对设计模式还处于刚知晓阶段,为此害我对设计模式的一直怀有敬畏之心,破书真是误认子弟啊。

废话不多说,先说说我对飞行模式的理解,相信大家看过GOF之后或者自己查阅资料后对其不一定能说出他的精髓所在,在我看来,只不过是一种节约内存的方式,换句话讲就是

<b>对于同一个对象保证在内存中只存储一次,即,不要出现重复存储同一个对象的编程方式</b>

这是我自己的见解,比较权威的说法就是:

<b>运用共享技术有效地支持大量细粒度的对象</b>

适用场合:

F l y w e i g h t模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况都成立时使用F l y w e i g h t模式:

• 一个应用程序使用了大量的对象。

• 完全由于使用大量的对象,造成很大的存储开销。

• 对象的大多数状态都可变为外部状态。

• 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。

• 应用程序不依赖于对象标识。由于F l y w e i g h t对象可以被共享,对于概念上明显有别的对

象,标识测试将返回真值。

<b>通俗的讲,如果在一个场合需要多个重复的对象的时候,即可以使用享元模式以节约资源,提高程序运行效率。典型的例子就是线程池,和数据库的连接池。</b>

<b></b>

<b>下面我将我的代码放出:</b>

using System;

using System.Collections;

namespace GOF.Flyweight

{

        public abstract class Flyweight

        {

                protected string name;

        }

        public class ConcreteFlyweight    : Flyweight

                public ConcreteFlyweight(string name)

                {

                        this.name = name;

                }

                public override string ToString()

                        return this.name;

        public class FlyweightFactory

                Hashtable ht = new Hashtable();

                public FlyweightFactory()

                public    Flyweight getFlyWeight(string name)

                        Flyweight an = ht[name] as Flyweight;

                        if(an==null)

                        {

                                an = new ConcreteFlyweight(name);

                                ht.Add(name, an);

                        }

                        return an;

                public void GetSize()

                        Console.WriteLine("FlyweightFactory's Size is " + ht.Count);

        class Program

                static void Main(string[] args)

                        FlyweightFactory factory = new FlyweightFactory();

                         Flyweight fly1 = factory.getFlyWeight("Google");

                         Flyweight fly2 = factory.getFlyWeight("Baidu");

                         Flyweight fly3 = factory.getFlyWeight("Google");

                         Flyweight fly4 = factory.getFlyWeight("Baidu");

                         Flyweight fly5 = factory.getFlyWeight("Google");

                         Flyweight fly6 = factory.getFlyWeight("Google");

                         Console.WriteLine(fly1.ToString());

                         Console.WriteLine(fly2.ToString());

                         Console.WriteLine(fly3.ToString());

                         Console.WriteLine(fly4.ToString());

                         Console.WriteLine(fly5.ToString());

                         Console.WriteLine(fly6.ToString());

                         factory.GetSize();

}

输出结果为:

Google

Baidu

FlyweightFactory's Size is 2

请按任意键继续. . .

在这段代码中最重要的一点是FlyWeightFactory中队hashtable的应用,通过hashtable来确保当前对象返回的是同一对象~,hashtable中有就返回,没有就新生成,并将其存入hashtable,这个是享元模式的代码的关键点所在,其实,这个才是他的精髓,至于,具体应用中,我觉得不一定非得按照我写的代码来,灵活运用,只要是确保自己的对象在内存中是唯一的即可~~

继续阅读