简介
享元模式,运用共享技术有效地支持大量细粒度的对象。享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
书中实例
小菜最近接了几个小型外包项目,主要是给一些私营业主做网站。事实上很多客户都需要这样的网站,但要求不太一样,有的人希望是新闻发布形式,有人希望是博客形式。可是每个网站租用一个空间,费用上很难降低。万能的大鸟今天来教他享元模式,帮他解决这一问题。
享元模式实现程序
//网站抽象类
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);
}
}
//用户
public class User
{
private string name;
public User(string name)
{
this.name = name;
}
public string Name
{
get { return name; }
}
}
//网站工厂类
class WebSiteFactory
{
private Hashtable flyweights = new Hashtable();
//获得网站分类
public WebSite GetWebSiteCategory(string key)
{
if (!flyweights.ContainsKey(key))
flyweights.Add(key, new ConcreteWebSite(key));
return ((WebSite)flyweights[key]);
}
//获得网站分类总数
public int GetWebSiteCount()
{
return flyweights.Count;
}
}
//客户端
class Program
{
static void Main(string[] args)
{
WebSiteFactory f = new WebSiteFactory();
WebSite fx = f.GetWebSiteCategory("产品展示");
fx.Use(new User("小菜"));
WebSite fy = f.GetWebSiteCategory("产品展示");
fy.Use(new User("大鸟"));
WebSite fl = f.GetWebSiteCategory("产品展示");
fl.Use(new User("倩倩"));
WebSite fm = f.GetWebSiteCategory("产品展示");
fm.Use(new User("富力士"));
WebSite fn = f.GetWebSiteCategory("产品展示");
fn.Use(new User("萨拉赫"));
Console.WriteLine("得到网站分类总数为 {0}", f.GetWebSiteCount());
Console.Read();
}
}
组成类图
关系介绍
享元类(Flyweight)是所有具体享元类(ConcreteFlyweight)的接口,是其父类。享元工厂和享元类之间是聚合关系,享元类拥有享元工厂类。客户端(Client)既和具体享元类是关联关系,也和享元工厂类是关联关系。
享元模式的构成
Flyweight(享元类):通过这个接口,享元类可以接受并作用于外部状态。
ConcreteFlyweight(具体享元类):是继承享元类或实现享元类的接口,并为内部状态增加储存空间。
UnsharedConcreteFlyweight(不共享具体享元类):是指那些不需要共享的享元类子类。因为享元类接口共享成为可能,但它并不强制共享。
FlyweightFactory(享元工厂):用来创建并管理享元类对象。
享元模式的优点
1.大大减少对象的创建,降低系统的内存,使效率提高。
使用场景
1.如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的储存开销时就应该考虑使用
2.对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可用相对较少的共享对象取代很多组对象