每个对象都写单例,单调又无聊。因此我写了个基类,只要集成,就实现了单例。
而且支持多单例(不同id对应不同的单例)
using System;
using System.Collections.Generic;
using System.Text;
namespace Pixysoft.DesignPattern
{
public class Singleton<T>
{
private Dictionary<string, T> dict = new Dictionary<string, T>();
private string _id = null;
private static volatile object instance;
private static object syncRoot = new Object();
public static T Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
instance = Activator.CreateInstance(typeof(T));
}
}
return (T)instance;
}
}
public T this[string id]
{
get
{
//如果是null,表示自己,则直接返回Instance
if (string.IsNullOrEmpty(id))
return Instance;
id = id.Trim().ToUpper();
lock (syncRoot)
{
if (dict.ContainsKey(id))
return dict[id];
object i = Activator.CreateInstance(typeof(T));
((Singleton<T>)i)._id = id;
T it = (T)i;
dict.Add(id, it);
return it;
}
}
}
public T this[int index]
{
get
{
if (index < 0 || index > dict.Keys.Count - 1)
return Instance;
int coutner = 0;
foreach (string key in dict.Keys)
{
if (coutner >= index)
return dict[key];
coutner++;
}
return Instance;
}
}
public string SingletonId
{
get { return _id; }
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Pixysoft.DesignPattern
{
public class Singleton<T>
{
private Dictionary<string, T> dict = new Dictionary<string, T>();
private string _id = null;
private static volatile object instance;
private static object syncRoot = new Object();
public static T Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
instance = Activator.CreateInstance(typeof(T));
}
}
return (T)instance;
}
}
public T this[string id]
{
get
{
//如果是null,表示自己,则直接返回Instance
if (string.IsNullOrEmpty(id))
return Instance;
id = id.Trim().ToUpper();
lock (syncRoot)
{
if (dict.ContainsKey(id))
return dict[id];
object i = Activator.CreateInstance(typeof(T));
((Singleton<T>)i)._id = id;
T it = (T)i;
dict.Add(id, it);
return it;
}
}
}
public T this[int index]
{
get
{
if (index < 0 || index > dict.Keys.Count - 1)
return Instance;
int coutner = 0;
foreach (string key in dict.Keys)
{
if (coutner >= index)
return dict[key];
coutner++;
}
return Instance;
}
}
public string SingletonId
{
get { return _id; }
}
}
}
使用方法:
class testclass
{
private void test()
{
Hello.Instance.Test();
Hello.Instance["id"].Test();
}
}
public class Hello : Singleton<Hello>
{
public void Test()
{
Console.Write("hello");
}
}
{
private void test()
{
Hello.Instance.Test();
Hello.Instance["id"].Test();
}
}
public class Hello : Singleton<Hello>
{
public void Test()
{
Console.Write("hello");
}
}
看看有什么错误等,希望能够指出。谢谢!
reborn_zhang@hotmail.com
美丽人生