Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1041637
  • 博文数量: 46
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1701
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-24 10:06
文章分类
文章存档

2014年(19)

2013年(27)

分类: C#/.net

2013-08-28 10:12:42

有时候感觉单例模式与静态类的区别并不是那么明显,都是与数据无关的操作类,即整个过程不能太多的数据依赖--更准确的说是对象依赖,最好是其只负责处理某一类型(传入的可以是接口)的对象,看看下面这段代码:
1
2
3
4
5
6
7
8
9
10
11
12
interface IPeople {
    string Name { set;}
    int Age { set; }
    string ToStringPeople();
}
class PeopleServer {
    public PeopleServer() { }
    public void ToStringPeople(IPeople p)
    {
        Console.WriteLine(p.ToStringPeople());
    }
}

这样所有实现IPeople接口的对象都可以被PeopleServer处理,降低模块间的耦合关系。那么静态类与单例模式的具体区别在哪儿呐?

区别

单例模式

静态类

继承

可以继承、实现接口

可以集成类,但不能实例成员

加载

单例模式比较灵活,可在需要的时候进行初始化

其在编译时就已经初始化了,成本相对昂贵,即使不使用。

资源释放

静态对象不会被GC清除,除非整个CLR/JVM退出。

在静态类中静态方法产生的对象,当起执行结束后会被GC清除

多态

可以有多态

不支持多态

对象扩展

因为单例模式是只有唯一的一个实例,它可以跟随系统进行动态的改变,有利于后期的增加和维护,并且具有状态性这一特征

不支持扩展

再说一下单例模式的优点:例如DAO初始化会比较占用系统资源,如果经静态方法,会不断初始化和释放资源,这个时候如果不涉及复杂的事务管理,则使用单例模式会比较好。而且其使用方便,初始化灵活,个人感觉其优于静态类。

在举个代码的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
///
/// 站点伪Url信息类
///
public class SiteUrls
{
    #region 内部属性和方法
    private static object lockHelper = new object();
    private static volatile SiteUrls instance = null;
    string SiteUrlsFile = Utils.GetXmlMapPath(DTKeys.FILE_SITE_XML_CONFING);
    private ArrayList _Urls;
    public ArrayList Urls
    {
        get { return _Urls; }
        set { _Urls = value; }
    }
    private NameValueCollection _Paths;
    public NameValueCollection Paths
    {
        get { return _Paths; }
        set { _Paths = value; }
    }
    private SiteUrls()
    {
        Urls = new ArrayList();
        Paths = new NameValueCollection();
        BLL.url_rewrite bll = new BLL.url_rewrite();
        List ls = bll.GetList("");
        foreach (Model.url_rewrite model in ls)
        {
            Paths.Add(model.name, model.path);
            model.page = model.page.Replace("^", "&");
            model.querystring = model.querystring.Replace("^", "&");
            Urls.Add(model);
        }
    }
    #endregion
    public static SiteUrls GetSiteUrls()
    {
        SiteUrls _cache = CacheHelper.Get(DTKeys.CACHE_SITE_HTTP_MODULE);
        lock (lockHelper)
        {
            if (_cache == null)
            {
                CacheHelper.Insert(DTKeys.CACHE_SITE_HTTP_MODULE, new SiteUrls(), Utils.GetXmlMapPath(DTKeys.FILE_URL_XML_CONFING));
                instance = CacheHelper.Get(DTKeys.CACHE_SITE_HTTP_MODULE);
            }
        }
        return instance;
    }
}

注意这个时候的private ArrayList _Urls;就可以在系统运行时动态增加是可变的,当我们更新SiteUrls的值的时候那么Cache对象对象已经被Remove掉了,当我们再次调用它的时候那么return instance可能就发生变化了,因为要再次从数据库了更新数据,把新数据放入缓存里面。


阅读(4073) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~