• 二十八.享元模式


    享元模式:

           Flyweight:运用共享技术有效地支持大量细粒度的对象

     

    注意:

    如果一个应用程序使用了大量的对象,而大量的这些对象造成很大的存储开销时就要考虑使用;

    对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以使用相对较少的共享对象取代很多组对象,此时可以考虑使用。

           实际上在.NET中,字符串string就是运用了Flyweight模式。Object.ReferenceEquals(objectobjA,object objB)方法是用来确定objA和objB是否是相同实例,返回bool值:

           StringA=”设计模式”;

           StringB=”设计模式”;

          Console.WriteLine(Object.ReferenceEquals(A,B));

           返回值是True,这两个字符串是相同实例

           如在围棋,象棋,五子棋等游戏开发时,我们只要实例化一个棋子对象,把棋子颜色,坐标等作为棋子的外部状态。

    Demo1

           Using System.Collections;

           class WebSiteFactory//网站工厂

        {

           private Hashtable flyweights = new Hashtable();

           //获得网站分类

           public WebSite GetWebSiteCategory(stringkey)

           {

               if (!flyweights.ContainsKey(key))

               {

                    flyweights.Add(key,newConcreteWebSite(key));

               }

                return ((WebSite)flyweights[key]);

           }

           //获取网站总数

           public int GetWebSiteCount()

           {

               return flyweights.Count;

           }

        }

    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);

           }

        }

    //用户 

        public class User

        {

           private string name;

           public User(string name)

           {

               this.name = name;

           }

           public string Name

           {

               get { return name; }

           }

        }

    static void Main(string[]args)

           {

               WebSiteFactory f = new WebSiteFactory();

               WebSite fx = f.GetWebSiteCategory("产品展示");

               fx.Use(new User("小菜"));

               WebSite fy = f.GetWebSiteCategory("产品展示");

               fy.Use(new User("大鸟"));

               WebSite fz = f.GetWebSiteCategory("产品展示");

               fz.Use(new User("娇娇"));

               WebSite f1 = f.GetWebSiteCategory("博客");

               f1.Use(new User("老顽童"));

               WebSite f2 =f.GetWebSiteCategory("博客");

               f2.Use(new User("桃谷六仙"));

               WebSite f3 = f.GetWebSiteCategory("博客");

               f3.Use(new User("南海鳄神"));

               Console.WriteLine("网站分类总数为{0}", f.GetWebSiteCount());

               Console.ReadKey();

           }

  • 相关阅读:
    正则判断手机号是不是11位
    jQuery, js 验证两次输了密码的一相同
    数据库读取图片
    使用 jQuery 修改 css 中带有 !important 的样式属性
    PHP去掉最后一个字符
    按钮
    js 实现两种99乘法表
    PHP 各种循环
    thinkphp的空控制器和空操作以及对应解决方法
    ThinkPHP框架知识
  • 原文地址:https://www.cnblogs.com/yaoge/p/1815257.html
Copyright © 2020-2023  润新知