public abstract class AbscractDALFactory
{
private static readonly AbscractDALFactory factory;
static AbscractDALFactory()
{
#region 切换数据工厂
string dbType = ConfigurationManager.AppSettings["dbType"].ToString();
if (dbType == "")
{
throw new Exception(string.Format("从配置文件webconfig中找不到 {0} 的链接字符串配置项!", dbType));
}
switch (dbType.Trim().ToUpper())
{
case "SQL2005":
factory = new SQL2005DALFactory();
break;
case "SQL2000":
factory = new SQL2000DALFactory();
break;
//case "MySQL":
//    factory = new MySQLDALFactory();
//    break;
}

#endregion
}
/// <summary>
/// 单例,通过静态构造函数产生
/// </summary>
/// <returns></returns>
public static AbscractDALFactory Instance()
{
return factory;
}
/// <summary>
/// 创建各个表的数据提供者
/// </summary>
/// <returns></returns>
public abstract IProductDataProvider CreateProductDataProvider();
public abstract IProductImagesDataProvider CreateProductImagesDataProvider(); }
 
我想问下这样创建AbscractDALFactory 对象有没有,线程安全的问题,
这个算不算饿汉单例模式,如果不算为什么???

解决方案 »

  1.   

    感觉把构造函数写成static,对于自身创建实例没撒意义了,直接引用不就完了?个人愚见昨天晚上看了点单例模式
      

  2.   

    你这不能算是单例模式原因如下:public abstract class AbscractDALFactory
        {
            private static readonly AbscractDALFactory factory;
            static AbscractDALFactory()
            {
                #region 切换数据工厂
                string dbType = ConfigurationManager.AppSettings["dbType"].ToString();
                if (dbType == "")
                {
                    throw new Exception(string.Format("从配置文件webconfig中找不到 {0} 的链接字符串配置项!", dbType));
                }
                switch (dbType.Trim().ToUpper())   问题开始处            {
                    case "SQL2005":
                        factory = new SQL2005DALFactory();
                        break;
                    case "SQL2000":
                        factory = new SQL2000DALFactory();
                        break;
                    //case "MySQL":
                    //    factory = new MySQLDALFactory();
                    //    break;
                }
                
                #endregion
            }
            /// <summary>
            /// 单例,通过静态构造函数产生
            /// </summary>
            /// <returns></returns>
            public static AbscractDALFactory Instance()
            {
                return factory;
            }
            /// <summary>
            /// 创建各个表的数据提供者
            /// </summary>
            /// <returns></returns>
            public abstract IProductDataProvider CreateProductDataProvider();
            public abstract IProductImagesDataProvider CreateProductImagesDataProvider();    }
    在在下表明的问题开始出不论你的数据工厂factory 是否为空你都在new,也就是说你在不断的new对象,有怎么可能实现在整个项目中只有一个AbscractDALFactory的实例呢 你应该在这里做一个判断看你的factory是否有实例了 要是有了就不要new了,Ok了线程方面你你改成单例模式了在讨论吧,呵呵
      

  3.   

    多线程的不太懂一般的,如果不是静态构造,是先判断为null才去new(),赋给一个private static对象
    静态构造函数只会自动调用一次( 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数)
    无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数http://msdn.microsoft.com/zh-cn/library/k9x6w0hc(v=VS.100).aspx
     
      

  4.   

    搞错了 是饿汉 你还是用的静态初始化 只是你返回实例用了Instance()其实对象还是在静态构造内实例化的和 静态构造没有区别 如果你把静态构造内的code转移到Instance()方法中就懒汉了
      

  5.   

    但放到 Instance()之后就出现9#说的问题了 你要判断一下
      

  6.   

    很显然,我是不想用懒汉模式,,因为需要自己做线程安全的维护,MSDN上推荐的也是静态构造初始化模式