基于不要返回null之EmptyFactory的應(yīng)用詳解
比如下面的GetUsers方法:
public class User
{
public string Id { get; set; }
public string Name { get; set; }
}
public List<User> GetUsers()
{
List<User> result = new List<User>();
// search db for user
return result;
}
如果其他方法由GetUsersOfxxx,GetUsersByXXX之類的方法,那么就有大量
List<User> result = new List<User>();
考慮到這一點(diǎn),可以將new List<User>() 封裝到方法中,這就是”工廠”模式了.
因?yàn)榭赡懿皇荓ist<User> ,也許是Stack<User> 更或者是ObservableCollection<User>
所以配合泛型,代碼如下:
public static class EmptyFactory
{
public static T Empty<T>() where T : IEnumerable, new()
{
return new T();
}
}
使用如下:
List<string> emptyList = new List<string>();
Stack<string> emptyStack = new Stack<string>();
ObservableCollection<string> emptyObserable = new ObservableCollection<string>();
emptyList = EmptyFactory.Empty<List<string>>();
emptyStack = EmptyFactory.Empty<Stack<string>>();
emptyObserable = EmptyFactory.Empty<ObservableCollection<string>>();
雖然這樣寫可以滿足要求,但是可以發(fā)現(xiàn)基本沒什么好處,寫EmptyFactory還不如new 來得快。
不過如果能夠緩存對象的話,也許EmptyFactory有作用。
考慮到這一點(diǎn),為EmptyFactory增加緩存機(jī)制的代碼如下,使用Dictionary<Type,Object> 來實(shí)現(xiàn)
public static class EmptyFactory
{
private static Dictionary<Type, object> cacheEmptyObjects =
new Dictionary<Type, object>();
public static T Empty<T>() where T : IEnumerable, new()
{
Type genericType = typeof(T);
if (cacheEmptyObjects.ContainsKey(genericType))
{
return (T)cacheEmptyObjects[genericType];
}
else
{
T tempEmptyObject = new T();
cacheEmptyObjects.Add(genericType, tempEmptyObject);
return tempEmptyObject;
}
}
}
測試代碼如下:
不過這種方法有一個(gè)缺陷,對于值類型而言,需要裝箱。
其根本原因是因?yàn)镋mptyFactory不知道T是什么,如果EmptyFactory知道T的話,那么就可以使用Dictionary<T,T> 的緩存了。
解決這個(gè)問題的思路是將EmptyFactory變成泛型類:
代碼如下:
public static class EmptyFactory<T> where T : IEnumerable, new()
{
private static Dictionary<Type, T> cacheEmptyObjects = new Dictionary<Type, T>();
public static T Empty()
{
Type genericType = typeof(T);
if (cacheEmptyObjects.ContainsKey(genericType))
{
return cacheEmptyObjects[genericType];
}
else
{
T tempEmptyObject = new T();
cacheEmptyObjects.Add(genericType, tempEmptyObject);
return tempEmptyObject;
}
}
}
使用的時(shí)候,只需要
當(dāng)然也可以EmptyFactory<List<User>>.Empty();
為什么不用Enumersble.Empty<T>方法呢?
因?yàn)镋numerable.Empty<T> 返回的是IEnumerable<T>對象。
相關(guān)文章
解析C#設(shè)計(jì)模式編程中適配器模式的實(shí)現(xiàn)
這篇文章主要介紹了C#設(shè)計(jì)模式編程中適配器模式的實(shí)現(xiàn),分別舉了類的對象適配器與對象的適配器模式的例子,需要的朋友可以參考下2016-02-02
詳解C#中的泛型以及編程中使用泛型的優(yōu)點(diǎn)
這篇文章主要介紹了詳解C#中的泛型以及編程中使用泛型的優(yōu)點(diǎn),對泛型的支持時(shí)C#語言中的重要特性,需要的朋友可以參考下2016-02-02
C#?將Excel轉(zhuǎn)為PDF時(shí)自定義表格紙張大小的代碼思路
這篇文章主要介紹了C#?將Excel轉(zhuǎn)為PDF時(shí)自定義表格紙張大小的代碼思路,轉(zhuǎn)換前的頁面大小設(shè)置為該版本中寫入的新功能,在舊版本和免費(fèi)版本中暫不支持,感興趣的朋友跟隨小編一起看看實(shí)例代碼2021-11-11
httpwebreqeust讀取httponly的cookie方法
下面小編就為大家?guī)硪黄猦ttpwebreqeust讀取httponly的cookie方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
Unity3D Shader實(shí)現(xiàn)掃描顯示效果(2)
這篇文章主要為大家詳細(xì)介紹了Unity3D Shader實(shí)現(xiàn)掃描顯示效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03

