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