主要解决细粒度对象出现的数量级比较大的情况之下资源的大量消耗问题。对系统的性能有很好的减缓作用,而这些细粒度一般是具有某些相同的成员函数或者字段属性,把相同的部分和不相同的部分分离开来。
UML如下:
例子代码如下(例子不大合理,能明白其中原理就行):


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Flyweight_pattern
{
class Program
{
static void Main(string[] args)
{
FlyweightFactory f = new FlyweightFactory();
PageSOHU sohu = new PageSOHU();
sohu.Setpage("max");
sohu.Display();
PageSina sina =(PageSina) f.Getpage("sina");
sina.Setpage("min");
sina.Display();
Console.ReadLine();
}
}
abstract class Flyweight
{
protected string pageStyle;
protected string page;
public abstract void Setpage(string pageStyleName);
public abstract void Display();
}
class PageSOHU : Flyweight
{
public PageSOHU()
{
page = "www.sohu.com";
}
public override void Setpage(string pageStyleName)
{
pageStyle = pageStyleName;
}
public override void Display()
{
Console.WriteLine("i am sohu page !");
}
}
class PageSina : Flyweight
{
public PageSina()
{
page = "www.sina.com.cn";
}
public override void Setpage(string pageStyleName)
{
pageStyle = pageStyleName;
}
public override void Display()
{
Console.WriteLine("i am sina page !");
}
}
class FlyweightFactory
{
Dictionary<string, Flyweight> flyweight = new Dictionary<string, Flyweight>();
public FlyweightFactory()
{
flyweight.Add("sohu", new PageSOHU());
flyweight.Add("sina",new PageSina());
}
public Flyweight Getpage(string pageName)
{
Flyweight f = flyweight[pageName] as Flyweight;
if (f==null)
{
switch(pageName)
{
case "sohu": f = new PageSOHU();
break;
case "sina": f = new PageSina();
break;
}
flyweight.Add(pageName,f);
}
return f;
}
//public FlyweightFactory()
//{
// flyweight.Clear();
//}
//public Flyweight this[string page]
//{
// get{
// if(!flyweight.ContainsKey(page))
// flyweight[page]=new Flyweight();
// return flyweight[page];
// }
//}
}
}