您的位置:首页 > 其它

设计模式学习11 Flyweight

2010-07-22 10:50 162 查看

应用场景:

解决在系统中存在大量细小对象耗费内存的情况。

实现代码:

// 参考:http://java.chinaitlab.com/model/795882_2.html
public abstract class Flyweight
{
public abstract void Operation();
}

public class ConcreteFlyWeight : Flyweight
{
private string str;

public ConcreteFlyWeight(string str)
{
this.str = str;
}

public override void Operation()
{
Console.WriteLine("Concrete--flyweight :" + this.str);
}
}

public class FlyweightFactory
{
private Hashtable flyweights = new Hashtable();

public FlyweightFactory()
{

}

// 这里其实是基于c#本身的语言特性来实现的:c#中将类赋值的话使用的是
// 引用,这里直接返回这个引用。
public Flyweight GetFlyWeight(object obj)
{
Flyweight flyweight = (Flyweight)this.flyweights[obj];

if (flyweight == null)
{
flyweight = new ConcreteFlyWeight((string)obj);
this.flyweights.Add(obj, flyweight);
}

return flyweight;
}

public int GetFactorySize()
{
return this.flyweights.Count;
}

}

public class FlyWeightPattern
{
FlyweightFactory factory = new FlyweightFactory();

Flyweight fly1;
Flyweight fly2;
Flyweight fly3;
Flyweight fly4;
Flyweight fly5;
Flyweight fly6;

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");
}

public void ShowFlyweight()
{
// ...
fly1.Operation();
fly2.Operation();
fly3.Operation();
fly4.Operation();
fly5.Operation();
fly6.Operation();

int size = factory.GetFactorySize();

Console.WriteLine("size = " + size);
}

public static void Main(string[] args)
{
Console.WriteLine("The FlyWeight Pattern!");
FlyWeightPattern pattern = new FlyWeightPattern();
pattern.ShowFlyweight();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: