如果希望在一个基类中实现单件模式(例如BaseClass.getInstance()),而且约束其派生类也是单件类,请问有什么方法可以实现?
(或者说,希望在基类中实现单件,而派生类不必为此再写代码?)

解决方案 »

  1.   

    楼主你这样设计比较怪异,基类的构造函数只能是protected而且子类的构造函数不能是public才行
      

  2.   

    一般单件模式 实现方法为 构造函数为private
    也就是说单件类 就不要有子类了
      

  3.   

    用单件模式实现的类一般都是sealed的,不能继承
    因为如果可以继承,那么由于使用单件模式,子类和父类其实就是同一个实例,这样继承就没有任何意义了
    如果子类和父类是不同的实例,那么就不是单件模式了
      

  4.   

    真是的单例模式必须是sealed密封类,而且构造方法必须是私有的 怎么去继承???
      

  5.   

    我记得java与模式上介绍了一个singleton的变体可以继承的
      

  6.   

    嗯,我的需求其实是这样的:要设计一系列的代理类,而这些代理类有若干个相同的操作,于是把它们放在一个抽象基类中。所有代理类都要求全局实例唯一,而如果每个代理类都定义一个静态变量和一个getInstance()之类的方法,觉得重复代码太多了,所以有以上的疑问。。
      

  7.   

    这样设计有逻辑问题吧?
     父类设计成singleton,被继承后的子类向上转型,就出现了多个父类对象,和父类singleton的约束矛盾了. 貌似singleton模式的目的之一本来就是不允许继承的
      

  8.   

    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;
        }
    }
    这样能实现你的需求吗
      

  9.   

    要限制全局唯一实例,这些代码是省不掉的吧?反正C#实现singleton代码简单啊
      

  10.   

    谢楼上
    不过还有个问题,就是要防止Proxy_A/B被用户实例化。。
      

  11.   

    你要是封装到dll里这样写就行了,其实不用太估计使用者的行为,你是无法全部预防的
      

  12.   

    给你个蹩脚方法
        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();
      

  13.   

    果然要用反射,谢谢楼上
    我之前在想如果用反射的话,是否可以在基类公开一个方法例如getInstance(),在其中动态创建类成员用来保存当前类的唯一实例并返回该实例