享元模式:运用共享技术有效地支持大量细粒度的对象
下面举例说明,假设项目需要创建多个数据库连接,但希望一个数据库只有一个连接实例
首先定义享元类:
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
享元模式可以避免大量非常类似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本都相同,如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度的减少单个实例的数目。如果一个应用程序使用了大量的对象,而这些对象造成了很大的存储开销时就应该考虑使用。