webabcd - 专注于asp.net, html5, silverlight

ASP.NET
从现在开始 一切都不晚
posts - 287, comments - 7866, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
[索引页]
[源码下载]


乐在其中设计模式(C#) - 单例模式(Singleton Pattern)


作者:webabcd


介绍
保证一个类仅有一个实例,并提供一个访问它的全局访问点。


示例
保证一个类仅有一个实例。



Singleton
using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Singleton
{
    
/// <summary>
    
/// 泛型实现单例模式
    
/// </summary>
    
/// <typeparam name="T">需要实现单例的类</typeparam>

    public class Singleton<T> where T : new()
    
{
        
/// <summary>
        
/// 返回类的实例
        
/// </summary>

        public static T Instance
        
{
            
get return SingletonCreator.instance; }
        }


        
class SingletonCreator
        
{
            
internal static readonly T instance = new T();
        }

    }

}



Test
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using Pattern.Singleton;

public partial class Singleton : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
// 使用单例模式,保证一个类仅有一个实例
        Response.Write(Singleton<Test>.Instance.Time);
        Response.Write(
"<br />");
        Response.Write(Singleton
<Test>.Instance.Time);
        Response.Write(
"<br />");

        
// 不用单例模式
        Test t = new Test();
        Response.Write(t.Time);
        Response.Write(
"<br />");
        Test t2 
= new Test();
        Response.Write(t2.Time);
        Response.Write(
"<br />");
    }

}


public class Test
{
    
private DateTime _time;

    
public Test()
    
{
        System.Threading.Thread.Sleep(
3000);
        _time 
= DateTime.Now;    
    }


    
public string Time
    
{
        
get return _time.ToString(); }
    }

}


运行结果
2007-2-10 22:35:11
2007-2-10 22:35:11
2007-2-10 22:35:14
2007-2-10 22:35:17


参考
http://www.dofactory.com/Patterns/PatternSingleton.aspx



OK
[源码下载] 

Feedback

#1楼  回复 引用 查看   

2007-07-25 18:15 by PPBoy      
public class Singleton<T> where T : new()

这句话意思是什么呀?这种语法第一次见,能帮忙解释下么~?

#2楼[楼主]  回复 引用 查看   

2007-07-25 19:39 by webabcd      
@PPBoy
泛型啊
可以参考这篇
http://www.cnblogs.com/webabcd/archive/2007/02/10/647154.html

#3楼  回复 引用   

2007-07-26 15:57 by pp孩[未注册用户]
where T : new()后头这点我不大明白……嘿嘿,我先去看你写的文章了~
webabcd大大

#4楼[楼主]  回复 引用 查看   

2007-07-26 18:20 by webabcd      
@pp孩
:)
“webabcd大大”是什么意思?我不老啊。。。

#5楼  回复 引用 查看   

2007-08-01 11:56 by PPBoy      
是说你很“大”的意思……
玩笑~呵呵
代表尊重啦~最近工作需要,正看服务器端组件呢,没及时过来,先不好意思下~

#6楼[楼主]  回复 引用 查看   

2007-08-01 12:12 by webabcd      
@PPBoy
:)
忙点好

#7楼  回复 引用 查看   

2007-08-02 00:35 by PPBoy      
@webabcd
刚刚接触.net(2个月),以前有点JAVA基础,工作一年就写ASP代码了~,。NET一点没有接触,学的时候还是觉得有点迷茫~~

现在熟悉了委托,和基本的C#语法,正在研究服务器端组件,大大有没有什么好的学习建议捏?嘿嘿~~~麻烦了~

#8楼[楼主]  回复 引用 查看   

2007-08-02 07:42 by webabcd      
@PPBoy
别着急,慢慢来
可以在webcast上找一些相关教程
或者这里http://asp.net/learn/

#9楼  回复 引用 查看   

2007-08-03 10:27 by PPBoy      
都是英文的呀~看的很累~~嘿嘿
谢谢大大,难得你这么热心呢~~祝好人好报

#10楼[楼主]  回复 引用 查看   

2007-08-03 10:39 by webabcd      
@PPBoy
英文看的吃力的话,就看看中文的webcast吧
http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/msdnwebcast.aspx

#11楼  回复 引用   

2007-09-01 18:21 by 郁闷[未注册用户]
我学的是Java Web应用上面的泛型实例就看到我们老师和我们讲过一次,是不是必须JDK1.5下才可以???

#12楼[楼主]  回复 引用 查看   

2007-09-03 07:54 by webabcd      
@郁闷
不好意思
对java web没有任何研究

#13楼  回复 引用   

2007-12-21 17:18 by vincent_shen[未注册用户]
请问一下:
internal static readonly T instance = new T();
这个每次运行一下就会新建一个T类的实例吧。
是不是只有在程序结束的时候才会释放这个资源呢?有办法自己写代码释放吗?

#14楼[楼主]  回复 引用 查看   

2007-12-21 19:29 by webabcd      
@vincent_shen
不会的
请注意一下,是嵌套类

#15楼  回复 引用 查看   

2008-04-02 16:51 by 狼Robot      
楼主是不是有设计模式的书?能不能发一份给我?

#16楼[楼主]  回复 引用 查看   

2008-04-02 17:24 by webabcd      
@狼Robot
没有啊
http://www.dofactory.com/上面学的

#17楼  回复 引用 查看   

2008-04-02 22:19 by 戏水      
请问 该方法线程安全吗?

#18楼  回复 引用 查看   

2008-04-02 22:19 by 戏水      
线程安全吗?

#19楼[楼主]  回复 引用 查看   

2008-04-03 08:34 by webabcd      
@戏水
static readonly
肯定是线程安全的

#20楼  回复 引用 查看   

2008-09-30 08:16 by 共同学习,共同进步      
@ webabcd
static readonly 肯定是线程安全的.
学习了.这种线程安全是交给了CLR了,我是猜的啊.因为它被赋了一次值就不在可以改变了.这也应该是最简化的单例模式了.

#21楼[楼主]  回复 引用 查看   

2008-10-06 08:00 by webabcd      
@共同学习,共同进步
:)
是的

#22楼  回复 引用   

2008-10-10 13:09 by leechzhao3[未注册用户]
线程是安全,不过这种方式的单列模式 如何做到真正的单列序列化呢?比如

[Serializable]
public class AlbumConfig
{
public int MaxAlbumCount
{
get;
set;
}

public bool AllowAlbum
{
get;
set;
}

private List<string> lista = new List<string>();
public List<string> Lista
{
get{return lista;}
set{lista=value;}
}


public void Serialiaze(AlbumConfig config,string FilePath)
{
ConfigManagerProvider.Save(config, FilePath);
}


public void Deserialiaze(Type type, string FilePath)
{
AlbumConfig cg = ((AlbumConfig)ConfigManagerProvider.Load(type, FilePath));
this.AllowAlbum = cg.AllowAlbum;
this.MaxAlbumCount = cg.MaxAlbumCount;
this.Lista = cg.Lista;
}
这样一个类。Deserialiaze是通过XML文件生成类本身。原先这个方法是返回AlbumConfig 类型。用你这个单列模式后改成这样的,感觉还是没有实现单列。

#23楼[楼主]  回复 引用 查看   

2008-10-10 17:40 by webabcd      
@leechzhao3
这个静态类,不用再单列了吧

#24楼  回复 引用   

2008-10-14 11:49 by leechzhao3[未注册用户]
嘿嘿钻下牛角尖嘛,你这种方式的单列,不知如何能在单列类对自身进行操作的好方式。用private _instance + lock的话就比较好实现了。

#25楼[楼主]  回复 引用 查看   

2008-10-15 07:17 by webabcd      
@leechzhao3
单列和线程安全不是一个概念的

#26楼  回复 引用   

2008-10-21 20:59 by 懒人都用马甲[未注册用户]
非常感谢。

#27楼[楼主]  回复 引用 查看   

2008-10-22 07:42 by webabcd      
@懒人都用马甲
:)
不谢

#28楼  回复 引用 查看   

2010-04-27 17:21 by gguozhenqian      
T: where new()
类型参数必须具有无参数的公共构造函数

#29楼  回复 引用 查看   

2010-04-27 17:22 by gguozhenqian      
短小精悍,

用一个通用的类 来创建所有类的 单例对象。

很棒。

#30楼[楼主]  回复 引用 查看   

2010-04-28 08:15 by webabcd      
@gguozhenqian
是,泛型的用处还是很广的

#31楼  回复 引用 查看   

2010-08-26 16:26 by 奈何倾城      
引用webabcd:@狼Robot
<br>没有啊
<br><a href="http://www.dofactory.com/" target="_new">http://www.dofactory.com/</a>上面学的

奇怪的是,我今天注册,结果总是显示验证码不对。

#32楼  回复 引用 查看   

2010-08-26 16:33 by 奈何倾城      
引用webabcd:@狼Robot
<br>没有啊
<br><a href="http://www.dofactory.com/" target="_new">http://www.dofactory.com/</a>上面学的

#33楼[楼主]  回复 引用 查看   

2010-08-27 08:11 by webabcd      
@奈何倾城
:)
不用注册啊,直接看就行了

#34楼  回复 引用 查看   

2010-08-27 13:01 by 奈何倾城      
@webabcd
哦,那我试试,其实我就是以前你帮我做了个SmartLabel的那位。
嘿嘿,楼主加油!

#35楼[楼主]  回复 引用 查看   

2010-08-27 16:49 by webabcd      
@奈何倾城
:)
肯定不用注册的,设计模式的文章都在这里http://www.dofactory.com/Patterns/Patterns.aspx

呵呵,知道你

一直努力中。。。就是经常有心无力,老了。。。

#36楼  回复 引用 查看   

2010-09-02 15:46 by 奈何倾城      
@webabcd
老当益壮,呵呵:)
你能一直坚持这写这些技术文档,让大家真的很受益。
正像是你说的--乐在其中!
也希望你哪天也能乐呵呵的把JAVA的相关技术文档这么有条理的发上来
期待ing 啦啦啦:)

#37楼[楼主]  回复 引用 查看   

2010-09-02 17:26 by webabcd      
@奈何倾城
:)
真的是不行了,理解东西没以前快了
当然越是这样越要努力,不然以后该没饭吃了

最近在做android开发,如果确定了android是我以后的重点发展方向的话,那么肯定会努力学习java的,呵呵,看情况了

#38楼  回复 引用 查看   

2010-11-11 08:58 by chenjun      
这个是什么原理保证实例只有一个 不太明白 一般不都要判断实例不存在 然后在创建吗

#39楼[楼主]  回复 引用 查看   

2010-11-11 16:39 by webabcd      
@chenjun
静态类型保证了实例只有一个

#40楼  回复 引用 查看   

2011-03-14 11:34 by larc      
我不是太明白,为什么这个泛型的类需要加约束?不是约束都是为了继承用的么?

#41楼[楼主]  回复 引用 查看   

2011-03-14 17:49 by webabcd      
@larc
这里的约束指的是具体类型必须在某个约束下
比如本例约束为 : new(),也就是说 T 要求是可实例化的

#42楼  回复 引用 查看   

2011-08-12 17:32 by ToString      
Test t1 = Singleton<Test>.Instance;
Test t2 = new Test();
t1 和 t2 是两个实例. 如果客户不按Singleton<Test>.Instance调用,而是直接new,问题出现了.

#43楼[楼主]  回复 引用 查看   

2011-08-15 08:36 by webabcd      
@ToString
什么问题?

#44楼  回复 引用 查看   

2011-08-15 11:56 by ToString      
本来只能有一个实例的Test,现在出现了两个甚至更多的实例.这难道不算是问题?

#45楼[楼主]  回复 引用 查看   

2011-08-15 13:04 by webabcd      
@ToString
:)
嗯,要new的话肯定是一个新实例
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 647140 i9grn716CMc=