享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
享元模式的特点是:复用我们内存中已存在的对象,降低系统创建对象实例的性能消耗。
什么时候用享元模式:如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
享元模式的结构图:
例子:给多个不同的客户做网站,他们的要求差别不大。如果每一个都申请一个空间、用一个数据库的话,而且代码差不多都是复制的话,那显然很糟糕,这时我们就想到可以用享元模式。
例子的结构图:
例子的代码:
//用户
public class User
{
private string name;
public User(string name)
{
this.name = name;
}
public string Name
{
get { return name; }
}
}
//网站抽象类
abstract class WebSite
{
public abstract void Use(User user);
}
//具体网站类
class ConcreteWebSite : WebSite
{
private string name = "";
public ConcreteWebSite(string name)
{
this.name = name;
}
public override void Use(User user)
{
Console .WriteLine ("网站分类:"+name +"用户:"+user.Name );
}
}
//网站工厂类
class WebSiteFactory
{
private Hashtable flyweights = new Hashtable();
//获得网站分类
public WebSite GetWebSiteCatefory(string key)
{
if (!flyweights.ContainsKey(key))
flyweights.Add(key, new ConcreteWebSite(key));
return ((WebSite)flyweights[key]);
}
//获得网站分类总数
public int GetWebSiteCount()
{
return flyweights.Count;
}
}
客户端代码:
static void Main(string[] args)
{
WebSiteFactory f = new WebSiteFactory();
WebSite fx = f.GetWebSiteCatefory("产品展示");
fx.Use (new User ("小菜"));
WebSite fy = f.GetWebSiteCatefory("产品展示");
fy.Use(new User("大鸟"));
WebSite fz = f.GetWebSiteCatefory("产品展示");
fz.Use(new User("娇娇"));
WebSite fl = f.GetWebSiteCatefory("博客");
fl.Use(new User("老顽童"));
WebSite fm = f.GetWebSiteCatefory("博客");
fm.Use(new User("桃谷六仙"));
WebSite fn = f.GetWebSiteCatefory("博客");
fn.Use(new User("南海鳄神"));
Console.WriteLine("得到网站分类总数为{0}",f.GetWebSiteCount ());
}