分类: 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
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
lock (lockHelper)
{
if (_cache == null)
{
CacheHelper.Insert(DTKeys.CACHE_SITE_HTTP_MODULE, new SiteUrls(), Utils.GetXmlMapPath(DTKeys.FILE_URL_XML_CONFING));
instance = CacheHelper.Get
}
}
return instance;
}
}
|
注意这个时候的private ArrayList _Urls;就可以在系统运行时动态增加是可变的,当我们更新SiteUrls的值的时候那么Cache对象对象已经被Remove掉了,当我们再次调用它的时候那么return instance可能就发生变化了,因为要再次从数据库了更新数据,把新数据放入缓存里面。