前言
享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。
一、网站抽象类
1 public abstract class WebSite2 {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、对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。
参考数据:大话设计模式