享元模式

享元模式:运用共享技术有效地支持大量细粒度的对象

下面举例说明,假设项目需要创建多个数据库连接,但希望一个数据库只有一个连接实例

首先定义享元类:

    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

享元模式可以避免大量非常类似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本都相同,如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度的减少单个实例的数目。如果一个应用程序使用了大量的对象,而这些对象造成了很大的存储开销时就应该考虑使用。

 

原文地址:https://www.cnblogs.com/angela217/p/5481936.html