我们在实际项目开发过程中,肯定遇到以下类似的情况:专为小型公司注册并显示的公司信息,提供不同样式的显示方式;我们不会为每个注册的账户的公司都开发出一套量身打造的网站,而且才用共享技术的方式来实现核心技术、其他变化部分采用外部变量的方式传入进行操作。这就是今天我们要讲的享元模式。
什么是享元模式?运用共享的技术有效地支持大量细粒级的对象。换种说法,就是减少创建对象的数量,减少系统开销。因为我们的硬件资源是有限的;
代码部分:
Flyweight类是超类,是具体享元类的接口;这里要将外部的状态传入并可进行处理;
abstract class Flyweight { public abstract void Operation(int extrinsicstate); }
class ConcreteFlyweight:Flyweight { public override void Operation(int extrinsicstate) { Console.WriteLine("具体的享元对象:"+extrinsicstate); } }
class UnshareConcreteFlyweight:Flyweight { public override void Operation(int extrinsicstate) { Console.WriteLine("不共享具体的享元对象:"+extrinsicstate); } }
class FlyweightFactory { private Hashtable flyweights=new Hashtable(); public FlyweightFactory() { //初始化享元的对象,我们也可以不用初始化,在获取数据的时候如果为null,则自动创建添加 flyweights.Add("x",new ConcreteFlyweight()); flyweights.Add("Y",new ConcreteFlyweight()); flyweights.Add("z",new ConcreteFlyweight()); } public Flyweight GetFlyweight(string key) { //如果我们没有在初始化享元对象,则不存在 采用添加的方式 /* if(!flyweights.ContainsKey(key)) { flyweights.Add(key,new ConcreteFlyweight()); } */ return ((Flyweight)flyweights[key]); } }
//客户端 static void Main(string[] arg) { //代码外部状态,这个就是变化部分 int extrinsicstate =100; FlyweightFactory fly=new FlyweightFactory(); Flyweight fx=fly.GetFlyweight("x"); fx.Operation(extrinsicstate--); Flyweight fx=fly.GetFlyweight("y"); fx.Operation(extrinsicstate--); Flyweight fx=fly.GetFlyweight("z"); fx.Operation(extrinsicstate--); UnshareConcreteFlyweight ux=new UnshareConcreteFlyweight(); ux.Operation(extrinsicstate--); }
原文地址:http://blog.csdn.net/sevenkj/article/details/43936831