interface IProxy { void Do(); } class Proxy_A : IProxy { public void Do() { Console.WriteLine("Proxy_A.Do()"); } } class Proxy_B : IProxy { public void Do() { Console.WriteLine("Proxy_B.Do()"); } } class ProxyFactory<T> where T : IProxy,new() { static readonly T _t = new T(); public T GetInstance() { return _t; } } 这样能实现你的需求吗
要限制全局唯一实例,这些代码是省不掉的吧?反正C#实现singleton代码简单啊
谢楼上 不过还有个问题,就是要防止Proxy_A/B被用户实例化。。
你要是封装到dll里这样写就行了,其实不用太估计使用者的行为,你是无法全部预防的
给你个蹩脚方法 interface IProxy { void Do(); } class Proxy_A : IProxy { Proxy_A() { Console.WriteLine("Proxy_A.ctor()"); } public void Do() { Console.WriteLine("Proxy_A.Do() "); } } class Proxy_B : IProxy { Proxy_B() { Console.WriteLine("Proxy_B.ctor()"); } public void Do() { Console.WriteLine("Proxy_B.Do() "); } } class ProxyFactory<T> where T : IProxy { static readonly T _t; static ProxyFactory() { _t = Construct(); } public static T GetInstance() { return _t; }
private static T Construct() { Type t_type = typeof(T); ConstructorInfo ci = t_type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[0], new ParameterModifier[0]); return (T)ci.Invoke(new object[0]); } } 调用: Proxy_A pa = ProxyFactory<Proxy_A>.GetInstance(); pa.Do(); Proxy_B pb = ProxyFactory<Proxy_B>.GetInstance(); pb.Do();
也就是说单件类 就不要有子类了
因为如果可以继承,那么由于使用单件模式,子类和父类其实就是同一个实例,这样继承就没有任何意义了
如果子类和父类是不同的实例,那么就不是单件模式了
父类设计成singleton,被继承后的子类向上转型,就出现了多个父类对象,和父类singleton的约束矛盾了. 貌似singleton模式的目的之一本来就是不允许继承的
{
void Do();
}
class Proxy_A : IProxy
{
public void Do() { Console.WriteLine("Proxy_A.Do()"); }
}
class Proxy_B : IProxy
{
public void Do() { Console.WriteLine("Proxy_B.Do()"); }
}
class ProxyFactory<T> where T : IProxy,new()
{
static readonly T _t = new T();
public T GetInstance()
{
return _t;
}
}
这样能实现你的需求吗
不过还有个问题,就是要防止Proxy_A/B被用户实例化。。
interface IProxy
{
void Do();
}
class Proxy_A : IProxy
{
Proxy_A() { Console.WriteLine("Proxy_A.ctor()"); }
public void Do() { Console.WriteLine("Proxy_A.Do() "); }
}
class Proxy_B : IProxy
{
Proxy_B() { Console.WriteLine("Proxy_B.ctor()"); }
public void Do() { Console.WriteLine("Proxy_B.Do() "); }
}
class ProxyFactory<T> where T : IProxy
{
static readonly T _t;
static ProxyFactory()
{
_t = Construct();
}
public static T GetInstance()
{
return _t;
}
private static T Construct()
{
Type t_type = typeof(T);
ConstructorInfo ci = t_type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic,
null, new Type[0], new ParameterModifier[0]); return (T)ci.Invoke(new object[0]);
}
}
调用:
Proxy_A pa = ProxyFactory<Proxy_A>.GetInstance();
pa.Do();
Proxy_B pb = ProxyFactory<Proxy_B>.GetInstance();
pb.Do();
我之前在想如果用反射的话,是否可以在基类公开一个方法例如getInstance(),在其中动态创建类成员用来保存当前类的唯一实例并返回该实例