【享元模式】
享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象,减少创建对象的数量以减少内存的占用和提高性能,提供了减少对象数量从而改善应用所需要的对象结构的方式
【介绍】
-
如何解决:用唯一标识码判断,如果在内存中又,则返回这个唯一标识码所标识的对象
-
关键代码:用MashMap存储这些对象
-
优点:大大减少了对象的创建,降低系统的内存,提高效率
-
缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不随着内部状态的变化而变化,否则则会造成系统的混乱
-
注意事项:注意划分外部状态和内部状态,否则会氢气线程安全问题;这些类必须有一个工厂对象加以控制
【实现】
步骤一:外部状态对象:用户
public class User
{
private string name;
public User(string name)
{
this.name = name;
}
public string Name
{
get { return name; }
}
}
步骤二:flayweight类:网站类
abstract class WebSite
{
public abstract void Use(User user);//方法需要传递用户对象
}
步骤三:concreteFlyweight类:具体网站类
class ConcreteWebSit:WebSite
{
private string name = "";
public ConcreteWebSit (string name)
{
this.name = name;
}
public override void Use(User user)
{
Console.WriteLine("网站分类:"+name+" 用户:"+user .Name );
}
}
步骤四:flyweightfactory类:网站工厂类
class WebSiteFactory
{
private Hashtable flyweights = new Hashtable();
//获得网站分类
public WebSite GetWebSiteCategory(string key)
{
if (!flyweights.ContainsKey(key))
flyweights.Add(key, new ConcreteWebSit(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("皮皮华"));
Console.WriteLine("");
WebSite fx1 = f.GetWebSiteCategory("产品展示");
fx1.Use(new User("皮皮杰"));
Console.WriteLine("");
WebSite fx2 = f.GetWebSiteCategory("产品展示");
fx2.Use(new User("皮皮军"));
Console.WriteLine("");
WebSite f1= f.GetWebSiteCategory("博客");
f1.Use(new User("皮皮鬼"));
Console.WriteLine("");
WebSite f2 = f.GetWebSiteCategory("博客");
f2.Use(new User("皮皮人"));
Console.WriteLine("");
WebSite f3= f.GetWebSiteCategory("博客");
f3.Use(new User("皮皮神"));
Console.WriteLine("");
Console.WriteLine("得到网站总数为:{0}",f.GetWebSiteCount ());
Console.Read();
}
}
步骤五:运行结果
网站分类:产品展示 用户:皮皮华
网站分类:产品展示 用户:皮皮杰
网站分类:产品展示 用户:皮皮军
网站分类:博客 用户:皮皮鬼
网站分类:博客 用户:皮皮人
网站分类:博客 用户:皮皮神
得到网站总数为:2
【总结】
一、在享元对象内部并且不会随着环境改变而改变的共享部分,称为是享元对象的内部状态,随着环境的改变而改变的,不可以共享的状态就是外部状态
二、享元模式可以避免大量非常相似类的开销。
三、如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时,就应该考虑使用,对象的大多数状态可以外部状态。如果删除对象的外部状态,那么可以用相对较少的共享对象取代很对组对象