享元模式
前言
享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。
一、网站抽象类
1 public abstract class WebSite
2 {
3 //"使用"方法需要传递“用户”对象
4 public abstract void Use(User user);
5 }
二、网站具体类
1 public class ConcreteWebSite : WebSite
2 {
3 private string name;
4 public ConcreteWebSite(string name)
5 {
6 this.name = name;
7 }
8 public override void Use(User user)
9 {
10 Console.WriteLine("网站分类:" + name + " 用户:" + user.Name);
11 }
12 }
三、网站工厂类
1 public class WebSiteFactory
2 {
3 private Hashtable flyWeights = new Hashtable();
4 //获得网站分类
5 public WebSite GetWebSiteCategory(string key)
6 {
7 if (!flyWeights.ContainsKey(key))
8 {
9 flyWeights.Add(key, new ConcreteWebSite(key));
10 }
11 return (WebSite)flyWeights[key];
12 }
13 //获得网站分类总数
14 public int GetWebSiteCount()
15 {
16 return flyWeights.Count;
17 }
18 }
四、客户端代码
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 WebSiteFactory f = new WebSiteFactory();
6
7 WebSite f1 = f.GetWebSiteCategory("产品展示");
8 f1.Use(new User("美美"));
9
10 WebSite f2 = f.GetWebSiteCategory("产品展示");
11 f2.Use(new User("柔柔"));
12
13 WebSite f3 = f.GetWebSiteCategory("产品展示");
14 f3.Use(new User("香香"));
15
16 WebSite f4 = f.GetWebSiteCategory("博客");
17 f4.Use(new User("丽丽"));
18
19 WebSite f5= f.GetWebSiteCategory("博客");
20 f5.Use(new User("探探"));
21
22 WebSite f6 = f.GetWebSiteCategory("博客");
23 f6.Use(new User("静静"));
24
25 Console.WriteLine("网站分类总数:{0}", f.GetWebSiteCount());
26 Console.Read();
27 }
28 }
五、总结
1、如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销就应该考虑使用。
2、对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
参考数据:大话设计模式