开发多用户注册使用的网站---享元模式

来源:互联网 发布:java创建对象关键字 编辑:程序博客网 时间:2024/04/28 08:40

        我们在实际项目开发过程中,肯定遇到以下类似的情况:专为小型公司注册并显示的公司信息,提供不同样式的显示方式;我们不会为每个注册的账户的公司都开发出一套量身打造的网站,而且才用共享技术的方式来实现核心技术、其他变化部分采用外部变量的方式传入进行操作。这就是今天我们要讲的享元模式。

      什么是享元模式?运用共享的技术有效地支持大量细粒级的对象。换种说法,就是减少创建对象的数量,减少系统开销。因为我们的硬件资源是有限的;


代码部分:

 Flyweight类是超类,是具体享元类的接口;这里要将外部的状态传入并可进行处理;

abstract class Flyweight{public abstract void Operation(int extrinsicstate);}

ConcreteFlyweight类为具体的享元类;

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

客户端比较简单,只是要注意我们这个地方有个外部的状态。我们在实际上区分不同的显示方式则根据外部变量来进行的。例如:在注册并显示不同公司的信息的时候,我们可以根据我们系统申请的ID(唯一值,就是外部状态)来传入显示公司的信息,并根据ID设定好的样式格式显示出来。

//客户端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--);}


      

0 0