讲解:运用共享技术有效地支持大量细粒度的对象。
AY:其实,在一定意义上,我个人认为单例模式和享元模式的初衷是一样的。他们都是一个基于空间和性能的模式。他们都是要控制对象的数量,而且实现方式本质上有着一些类似,就是首先查询这个对象是否存在,然后返回这个对象。
那么从享元模式上的引申,我们就一样可以用到单例模式上了:
1. 我们可以不局限于单例,而是可以控制为多例。比如说:类似我前面对象池的目的
2. 单例只是对象么?我们一样可以把子系统和模块单例!
看看他们的不同:
应该说享元模式是单例模式的一个延伸。享元模式通过享元工厂来控制多个对象的单例化。而单例化解决的只是本身的单例问题!
结构图:
实现很简单,别看图就害怕了。一个键值队列表,例如Has和table维护 一个对象池而已
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace StrategyMo.XiangYuan { public abstract class Flyweight { public abstract void Operation(int extrinsicstate); } public class ConcreteFlyweight : Flyweight { public override void Operation(int extrinsicstate) { Console.WriteLine("具体FlyWeight:" + extrinsicstate); } } public class UnsharedConcreteFlyweight : Flyweight { public override void Operation(int extrinsicstate) { Console.WriteLine("不需要共享的FlyWeight" + extrinsicstate); } } public class FlyweightFactory { private Hashtable flyweights = new Hashtable(); public FlyweightFactory() { flyweights.Add("x", new ConcreteFlyweight()); flyweights.Add("y", new ConcreteFlyweight()); flyweights.Add("z", new ConcreteFlyweight()); } public Flyweight GetFlyweight(string key) { return (Flyweight)flyweights[key]; } } }
客户端:
int extrinstate = 26; FlyweightFactory f = new FlyweightFactory(); Flyweight fx = f.GetFlyweight("x"); fx.Operation(--extrinstate); Flyweight fy = f.GetFlyweight("y"); fx.Operation(--extrinstate); Flyweight fz = f.GetFlyweight("z"); fx.Operation(--extrinstate); UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight(); uf.Operation(--extrinstate);
效果图:
1. 系统中要有大量的对象,这才值得用享元模式。否则你去维护一张对象表,就不值得了。
2. 对象的创建是会消耗大量时间的过程,并且对象占用较大内存。如果不是,那就让系统去创建吧。
3. 在B/S的系统中,个人感觉享元的应用相对较少,Web的无状态,加之我们完全在客户端进行一系列的复杂逻辑,然后将之统一传递给Web服务器端,而不需要享元。享元主要应用还是在C/S及Winform的本地程序上较多。
C# string就是用了享元模式,所以说字符串越多,内存消耗越大了,所以说string少用最好,不然占内存。如果设计到字符串拼接,考虑stringbuilder、
原来,一直在用