享元模式

前言

  享元模式(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、对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

  参考数据:大话设计模式

原文地址:https://www.cnblogs.com/hyunbar/p/10043762.html