有時候感覺單例模式與靜態類的區別並不是那麼明顯,都是與數據無關的操作類,即整個過程不能太多的 數據依賴--更准確的說是對象依賴,最好是其只負責處理某一類型(傳入的可以是接口)的對象,看看下面這 段代碼:
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處理,降低模塊間的耦合關系。那麼靜態 類與單例模式的具體區別在哪兒吶?

再說一下單例模式的優點:例如DAO 初始化會比較占用系統資源,如果經靜態方法,會不斷初始化和釋放資源,這個時候如果不涉及復雜的事務管 理,則使用單例模式會比較好。而且其使用方便,初始化靈活,個人感覺其優於靜態類。
在舉個代碼 的例子:
/// <summary>
/// 站點偽Url信息類
/// </summary>
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<Model.url_rewrite> 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<SiteUrls>(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<SiteUrls>(DTKeys.CACHE_SITE_HTTP_MODULE);
}
}
return instance;
}
}
注意這個時候的private ArrayList _Urls;就可以在系統運行時動態增加是可變的,當我們更新 SiteUrls的值的時候那麼Cache對象對象已經被Remove掉了,當我們再次調用它的時候那麼return instance可 能就發生變化了,因為要再次從數據庫了更新數據,把新數據放入緩存裡面。