享元模式
享元模式:运用共享技术有效地支持大量细粒度的对象
下面举例说明,假设项目需要创建多个数据库连接,但希望一个数据库只有一个连接实例
首先定义享元类:
public abstract class Flayweight
{
public abstract void ShowConnectionInfo();
}
public class SQLDBConnection:Flayweight
{
private string Name { get; set; }
public SQLDBConnection(string name)
{
Name = name;
}
public override void ShowConnectionInfo()
{
Console.WriteLine("SQL Connection. Name {0}", Name);
}
}
下面创建享元工厂,用来创建并管理享元对象。它确保合理的共享享元,当用户请求某个享元时,享元工厂对象提供一个已创建的实例或者创建一个实例提供给用户
public class FlayweighFactory
{
/// <summary>
/// 已存在的享元对象列表
/// </summary>
private Dictionary<string, SQLDBConnection> flayweights=new Dictionary<string,SQLDBConnection>();
public SQLDBConnection GetConnectionByKey(string key)
{
//不存在则创建
if (!flayweights.ContainsKey(key))
{
flayweights.Add(key, new SQLDBConnection(key));
}
//返回请求的享元
return flayweights[key];
}
public void GetflayweightCount()
{
Console.WriteLine("Flayweight Count {0}", flayweights.Count);
}
}
客户端调用代码如下:
FlayweighFactory factory = new FlayweighFactory();
SQLDBConnection OTLConn = factory.GetConnectionByKey("OTLDB");
SQLDBConnection PAMConn = factory.GetConnectionByKey("PAMDB");
SQLDBConnection OTLConn2 = factory.GetConnectionByKey("OTLDB");
OTLConn.ShowConnectionInfo();
PAMConn.ShowConnectionInfo();
OTLConn2.ShowConnectionInfo();
factory.GetflayweightCount();
执行结果如下:
SQL Connection. Name OTLDB
SQL Connection. Name PAMDB
SQL Connection. Name OTLDB
Flayweight Count 2
享元模式可以避免大量非常类似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本都相同,如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度的减少单个实例的数目。如果一个应用程序使用了大量的对象,而这些对象造成了很大的存储开销时就应该考虑使用。

浙公网安备 33010602011771号