zoukankan      html  css  js  c++  java
  • 享元模式

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

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

    首先定义享元类:

        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

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

     

  • 相关阅读:
    图解VS2008单元测试及查看代码覆盖率
    Effective C++:条款02:尽量以const, enum, inline替换#define (Prefer consts, enums, and inline to #defines.)
    Effective C++:条款01:视C++为一个语言联邦(View C++ as a federation of languages.)
    Effective C++:条款03:尽可能使用const (Use const whenever possible.)
    mysql foreign key <转>
    Linux下Apache绑定多个域名的方法 <转>
    python(1)input()和raw_input
    《精通CSS》读书笔记(1)
    CSS相对定位和绝对定位
    【分享】沪江网提供的每日一句API
  • 原文地址:https://www.cnblogs.com/angela217/p/5481936.html
Copyright © 2011-2022 走看看