单例模式(Singleton)

简单工厂模式中讲到存放数据库连接信息,这里将怎样获取连接信息,通常一个应用程序中连接信息应该是全局唯一的,因此,我们想到单例模式。下面我就将怎样写一个单例模式的例子来获取数据库连接信息。简单,我相信大家都能看得懂,我就不再赘述了。代码如下:

(1)存放连接信息的XML文件结构 

<?xml version="1.0" encoding="utf-8" ?>
<ConnInfos>
    <ConnInfo>
        <Name>HR</Name>
        <Type>Oralce</Type>
        <ConnString>Data Soure=;user=;password=;</ConnString>
    </ConnInfo>
    <ConnInfo>
        <Name>Main</Name>
        <Type>SqlServer</Type>
        <ConnString>Data Source=;Initial Catalog=;Integrated Security=True</ConnString>
    </ConnInfo>
</ConnInfos>

(2)获取连接信息类别

public class ConnManager
{
    //存放连接信息
    private static Hashtable _connData = Hashtable.Synchronized(new Hashtable());
    //连接管理者实例
    private static ConnManager _instance = new ConnManager();

    private const string Default_Name = "MAIN"; //默认连接名称
    private const string File_Name = @"C:\Conn.xml";

    //私有构造函数,防止实例化
    private ConnManager()
    {
        LoadData(); //载入数据
    }

    private void LoadData()
    {
        BufferedStream bs = null;
        try
        {
            bs = new BufferedStream(new FileStream(File_Name, FileMode.Open, FileAccess.Read));
            XmlDocument xd = new XmlDocument();
            xd.Load(bs);
            XmlNodeList xnl = xd.GetElementsByTagName("ConnInfo");
            if (xnl.Count > 0)
            {
                foreach (XmlNode xn in xnl)
                {
                    if (xn.HasChildNodes)
                    {
                        XmlNode n1 = xn.SelectSingleNode("Name");
                        XmlNode n2 = xn.SelectSingleNode("Type");
                        XmlNode n3 = xn.SelectSingleNode("ConnString");
                        string name = n1 != null ? n1.FirstChild.Value : String.Empty;
                        string type = n2 != null ? n2.FirstChild.Value : String.Empty;
                        string connStr = n3 != null ? n3.FirstChild.Value : String.Empty;
                        _connData.Add(name.ToUpper(), new ConnInfo(name, type, connStr));
                    }
                }
            }
            bs.Close();
        }
        catch
        {
            bs.Close();
        }
    }

    public int Count
    {
        get { return _connData.Count; }
    }

    public static ConnManager GetInstance()
    {
        return _instance;
    }

    public static ConnInfo GetConnInfoByName(string name)
    {
        string name = name.ToUpper();
        if (_connData[name] != null)
        {
            return _connData[name] as ConnInfo;
        }
        else
        {
            return null;
        }
    }

    public static ConnInfo GetConnInfo()
    {
        return GetConnInfoByName(Default_Name);
    }
}
posted @ 2008-07-29 08:47  known  阅读(378)  评论(0编辑  收藏  举报