zoukankan      html  css  js  c++  java
  • 享元模式

    杰杰:享元模式:见名知意,重点就是共享,当系统内存在大量的对象的时候,而这些对象我们可能会在不同地方调用它的方法,如果每次在调用的时候,都实例化,给系统内存带来了极大的负担,享元模式尤其是享元工厂类很好的解决了这个问题,它将我们使用的对象实例,存储起来,在下次使用的时候,我们调用该已经被创建的实例,而不是利用系统内存再创建一个新的实例。

    https://www.cnblogs.com/abcdwxc/archive/2007/09/12/890556.html 借鉴于这篇文章,很有参考价值

    适用性:   

    当以下所有的条件都满足时,可以考虑使用享元模式:

    1、   一个系统有大量的对象。

    2、   这些对象耗费大量的内存。

    3、   这些对象的状态中的大部分都可以外部化。

    4、   这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。

    5、   软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。(这个是很重要的,如果一个对象的实例被重复使用与初始实例不相同的话,不能使用哦)

    满足以上的这些条件的系统可以使用享元对象。最后,使用享元模式需要维护一个记录了系统已有的所有享元的表,而这需要耗费资源。因此,应当在有足够多的享元实例可供共享时才值得使用享元模式。

    杰杰使用简短一点的代码来实现,体会一下享元模式与享元工厂类处理的巧妙奥妙所在。

    代码实现:

     #region 抽象基类(将公共的提取出来)
        public abstract class Share
        {
            public abstract void Display();
    
        }
        #endregion
     #region 具体需要被共享的类
        public class A : Share
        {
            public override void Display()
            {
                Console.WriteLine("A类触发");
            }
        }
        public class B:Share
        {
            public override void Display()
            {
                Console.WriteLine("B类触发");
            }
        }
        #endregion
      #region 享元工厂类(最重要!)
        public class ShareFactory
        {
            private Hashtable hash = new Hashtable();
            private Share _share;
            public Share GetElement(string name)
            {
                _share = (Share)hash[name];
                if(_share == null)
                {
                    switch (name)
                    {
                        case "A":
                            _share = new A();
                            break;
                        case "B":
                            _share = new B();
                            break;
                    }
                    hash[name] = _share;
                }
                return _share;
            }
        }
        #endregion
       static void Main(string[] args)
            {
                ShareFactory sharefactory = new ShareFactory();//Share所有的方法,都通过调用工厂方法获取,在界面不出现任何Share的显示实例
                sharefactory.GetElement("A").Display();
                sharefactory.GetElement("B").Display();
                Console.ReadKey();
            }

  • 相关阅读:
    网站学习网站
    ajax利用json进行服务器与客户端的通信
    Json 数据
    Servlet 编程 请求的转发
    Servlet 编程 简单流程处理(重定向)
    Servlet 编程 http请求类型
    myeclipse10 .jsp将表单提交给.java(form网页与后台通信初识)
    myeclipse10 将一个java工程合并到web工程
    myeclipse 第一个web project
    JAVA字符串转日期或日期转字
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/12201780.html
Copyright © 2011-2022 走看看