• 享元模式


    前言

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

      参考数据:大话设计模式

  • 相关阅读:
    闲谈:价值、服务、时间、用户体验、美、过度开发
    笔记:Sublime Text 3
    快速切换目录命令go
    miniPy for CentOS 5/6
    用Fabric实现小批量的自动化上线
    异步多线程C/S框架gko_pool
    Reboot分享第三期(已结束)
    Reboot分享第二期(已结束)
    Reboot分享第一期(已结束)
    iptables从入门到精通
  • 原文地址:https://www.cnblogs.com/hyunbar/p/10043762.html
Copyright © 2020-2023  润新知