您的位置:首页 > 运维架构 > 网站架构

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

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

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



代码部分:

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

}

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐