简单介绍一下享元模式。一开始看到这个名字,我也不是很理解,为什么叫做“享元”模式,后来看了才明白是共享原物件的意思。
定义:
运用共享技术来减少内存的占用。如果有一个实例化的例子,然后再有一个和它一样内容的例子的话,就不再进行实例化,它可以和上一个例子共享内存。
它分为内部状态和外部状态:
内部状态:在享元对象内部不随外界环境改变而改变的共享部分。
外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。
举个下五子棋的例子:
内部状态就是两个棋的颜色,外部状态是棋子的位置。如果没有享元模式的话,每走一步,都需要进行实例化,很浪费资源。
举设计模式中的例子:网页分为用户登录端和一些复用的内容,比如相同的功能。
用户端:
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 GetWebSiteCategory(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.GetWebSiteCategory("产品展示");
fx.Use(new User("小明"));
Console.ReadKey();
}
static void Main(string[] args)
{
WebsiteFactory f = new WebsiteFactory();
Website fx = f.GetWebSiteCategory("产品展示");
fx.Use(new User("小红"));
Console.ReadKey();
}
static void Main(string[] args)
{
WebsiteFactory f = new WebsiteFactory();
Website fx = f.GetWebSiteCategory("博客");
fx.Use(new User("小张"));
Console.ReadKey();
}
static void Main(string[] args)
{
WebsiteFactory f = new WebsiteFactory();
Website fx = f.GetWebSiteCategory("博客");
fx.Use(new User("小李"));
Console.ReadKey();
}
分析:
此行代码:
public Website GetWebSiteCategory(string key)
{
if (!flyweights.ContainsKey(key))
flyweights.Add(key, new ConcreteWebSite(key));
return ((Website)flyweights[key]);
}
如果没有“产品展示”,则实例化一个,如果有的话,再次遇到“产品展示”时则直接返回,不再重新实例化。