享元模式

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

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

posted @ 2020-01-16 16:08  程序杰杰  阅读(156)  评论(0编辑  收藏  举报